材料表
材料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
材料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
表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
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的交叉联接
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
(
[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 行受影响)