材料表
材料ID  ROW_ID    名称     类型   父ID
CL1      1        C10       1     0
CL2      2        C20       1     0
CL3      3        C10水     1     1
CL4      4        C10砂     1     1
CL5      5        C20石     1     2
CL6      6        C20水     1     2
CL7      7        C30细     1     14
CL8      8        C30粗     1     14
CL9      9        水泥      0     0
CL10     10       沙子      0     0
CL11     11       石子      0     0
CL12     12       矿粉      0     0
CL13     13       外加剂    0     0
CL14     14        C30      1     0
生产表
生产ID  材料ID   生产数量  日期
SC1      CL3      100      2012-2-27
SC2      CL4      100      2012-2-28
SC3      CL5      200      2012-2-29
SC4      CL6      100      2012-3-1消耗表
消耗ID  生产ID  
XH1     SC1
XH2     SC2
XH3     SC3
XH4     SC4消耗明细
消耗明细ID  消耗ID   消耗材料ID   消耗数量
XHMX1        XH1      CL9          25
XHMX2        XH1      CL10         25
XHMX3        XH1      CL11         25
XHMX4        XH1      CL12         25
XHMX5        XH1      CL13         0
XHMX6        XH2      CL9          25
XHMX7        XH2      CL10         25
XHMX8        XH2      CL11         25
XHMX9        XH2      CL12         25
XHMX10       XH2      CL13         0
XHMX11       XH3      CL9          50
XHMX12       XH3      CL10         50
XHMX13       XH3      CL11         50
XHMX14       XH3      CL12         50
XHMX15       XH3      CL13         0
XHMX16       XH2      CL9          25
XHMX17       XH2      CL10         25
XHMX18       XH2      CL11         25
XHMX19       XH2      CL12         25
XHMX20       XH2      CL13         0要求的查询结果(在某个时间段内的生产和消耗)
材料名称   生产数量   消耗材料名称    消耗数量 
C10        200        水泥             50
C10        200        沙子             50
C10        200        石子             50
C10        200        矿粉             50
C10        200        外加剂           0
C20        300        水泥             75
C20        300        沙子             75
C20        300        石子             75
C20        300        矿粉             75
C20        300        外加剂           0
C30        0          水泥             0
C30        0          沙子             0
C30        0          石子             0
C30        0          矿粉             0
C30        0          外加剂           0

解决方案 »

  1.   

    现在简单话一下 有两张表
    表A
    成品名称 成品数量 消耗名称 消耗数量
    C10      200      水泥      50  
    C10      200      石子      50 
    C10      200      矿粉      50 
    C10      200      沙子      50
    表B
    成品名称
    C10
    C20
    C30
    要求查询结果为
    成品名称 成品数量 消耗名称 消耗数量
    C10      200      水泥      50  
    C10      200      石子      50 
    C10      200      矿粉      50 
    C10      200      沙子      50
    C20       0       水泥      0  
    C20       0       石子      0 
    C20       0       矿粉      0 
    C20       0       沙子      0
    C30       0       水泥      0  
    C30       0       石子      0 
    C30       0       矿粉      0 
    C30       0       沙子      0 
      

  2.   

    如果单单就实现来说,可以参考以下SQL语句:
    SELECT name1, 
    CASE WHEN name1 <> name2 THEN 0 ELSE Amount END AS Amount, 
    KName, 
    CASE WHEN A.name1 <> name2 THEN 0 ELSE Quantiy END AS Quantity
    FROM
    (
    SELECT A.name AS name1, B.name AS name2, B.Amount, B.KName, B.Quantiy FROM Table2 AS A
    CROSS JOIN Table1 AS B 
    ) AS A
    说下思路:
    看样子像提取笛卡尔积你可以查查MSDN的交叉联接
      

  3.   

    创建语句:
    CREATE TABLE Table1
    (
    [name] VARCHAR(10),
    Amount INT,
    KName VARCHAR(10),
    Quantiy INT
    )
    GOCREATE TABLE Table2
    (
    [name] VARCHAR(10)
    )
    GOINSERT INTO Table1
    SELECT 'C10', 200, '水泥', 50 UNION ALL
    SELECT 'C10', 200, '石子', 50 UNION ALL
    SELECT 'C10', 200, '矿粉', 50 UNION ALL
    SELECT 'C10', 200, '沙子', 50 
    GOINSERT INTO Table2
    SELECT 'C10' UNION ALL
    SELECT 'C20' UNION ALL
    SELECT 'C30'
    GO
      

  4.   

    CREATE TABLE table1
    (
    [name] VARCHAR(10),
    Amount INT,
    KName VARCHAR(10),
    Quantiy INT
    )
    GOCREATE TABLE table2
    (
    [name] VARCHAR(10)
    )
    GOINSERT INTO table1
    SELECT 'C10', 200, '水泥', 50 UNION ALL
    SELECT 'C10', 200, '石子', 50 UNION ALL
    SELECT 'C10', 200, '矿粉', 50 UNION ALL
    SELECT 'C10', 200, '沙子', 50  
    GOINSERT INTO Table2
    SELECT 'C10' UNION ALL
    SELECT 'C20' UNION ALL
    SELECT 'C30'
    GO
     
    select s.name, isnull(a.Amount,0)as Amount ,s.KName,   isnull(a.Quantiy,0)as Quantiy   from 
    (select t.name,b.KName from table2 t  , table1 b  ) s left  join table1 a on s.name=a.name and s.KName=a.KName drop table table1,table2
    name       Amount      KName      Quantiy
    ---------- ----------- ---------- -----------
    C10        200         水泥         50
    C10        200         石子         50
    C10        200         矿粉         50
    C10        200         沙子         50
    C20        0           水泥         0
    C20        0           石子         0
    C20        0           矿粉         0
    C20        0           沙子         0
    C30        0           水泥         0
    C30        0           石子         0
    C30        0           矿粉         0
    C30        0           沙子         0(12 行受影响)