日期:2014-05-17  浏览次数:20389 次

行专列问题
数据如下:
不良表:
日期             品名 不良项目 数量
2012/12/1 1451-EE29-18 砂渣孔         1
2012/12/1 1451-EE29-18 文字不良 1
2012/12/1 1451-EJ33-28 壳模损坏 2
2012/12/1 5531-0803-58 壳模破裂 18
2012/12/1 5541-0503-58 壳内穿刺 60
2012/12/1 3852-1602-68 壳模脱落 1
2012/12/1 3111-0510-58 缩孔         1
2012/12/1 5541-0603-58 鼓胀         1
2012/12/1 1481-AF02-28 缩孔         1
2012/12/1 1451-EE29-18 缩孔         1
2012/12/1 1451-EK47-18 缩孔         1
入库表:
日期             品名 数量
2012/12/1 1451-EE29-18 2
2012/12/1 1451-EE29-18 2
2012/12/1 1451-EJ33-28 52
2012/12/1 5531-0803-58 203
2012/12/1 5541-0503-58 410
2012/12/1 3852-1602-68 2
2012/12/1 3111-0510-58 819
2012/12/1 5541-0603-58 257
2012/12/1 1481-AF02-28 57
2012/12/1 1451-EE29-18 2
2012/12/1 1451-EK47-18 50

想要的结果:
日期 品名 鼓胀 壳模破裂 壳模损坏 壳模脱落 壳内穿刺 砂渣孔 缩孔 文字不良 总计 入库数量 不良率%
2012/12/1 1451-EE29-18 1 1 1 3 6 33.33
2012/12/2 1451-EJ33-28 2 2 52 3.70
2012/12/3 1451-EK47-18 1 1 50 1.96
2012/12/4 1481-AF02-28 1 1 57 1.72
2012/12/5 3111-0510-58 1 1 819 0.12
2012/12/6 3852-1602-68 1 1 2 33.33
2012/12/7 5531-0803-58 18 18 203 8.14
2012/12/8 5541-0503-58 60 60 410 12.77
2012/12/9 5541-0603-58 1 1 257 0.39



------解决方案--------------------
SELECT '日期' = CONVERT(VARCHAR(10),A.日期,120),
       A.品名,
       '砂渣孔' = ISNULL(SUM(CASE WHEN 不良项目 = '砂渣孔' THEN B.数量 END),0),
       '缩孔' = ISNULL(SUM(CASE WHEN 不良项目 = '缩孔' THEN B.数量 END),0),
       '文字不良' = ISNULL(SUM(CASE WHEN 不良项目 = '文字不良' THEN B.数量 END),0),
       '壳模损坏' = ISNULL(SUM(CASE WHEN 不良项目 = '壳模损坏' THEN B.数量 END),0),
       '壳模脱落' = ISNULL(SUM(CASE WHEN 不良项目 = '壳模脱落' THEN B.数量 END),0),
       '壳模破裂' = ISNULL(SUM(CASE WHEN 不良项目 = '壳模破裂' THEN B.数量 END),0),
       '壳内穿刺' = ISNULL(SUM(CASE WHEN 不良项目 = '壳内穿刺' THEN B.数量 END),0),
       '鼓胀' = ISNULL(SUM(CASE WHEN 不良项目 = '鼓胀' THEN B.数量 END),0),
       '总计' = ISNULL(C.不良数量,0),
       A.入库数量,
       '不良率%' = 100.0*ISNULL(C.不良数量,0)/NULLIF(A.入库数量+C.不良数量,0)
FROM (SELECT CONVERT(VARCHAR(10),日期,120) AS '日期',品名,SUM(数量) AS '入库数量' FROM 入库表
      GROUP BY CONVERT(VARCHAR(10),日期,120),品名) A
  LEFT JOIN 不良表 B ON B.品名 = A.品名 AND CONVERT(VARCHAR(10),B.日期,120) = CONVERT(VARCHAR(10),A.日期,120)
  LEFT JOIN (SELECT CONVERT(VARCHAR(10),日期,120) AS '日期',品名,SUM(数量) AS '不