SQL多行列转换本人没理解如何变通实现--惭愧请教

wuyongbiao 2013-07-08 01:55:17
各位:
我有一实现SQL查询结果

Select pno [产品],Convert(varchar(100), planDate,11) [日期],
SUM(planQty) [计划数],
SUM(Isnull(injQty,0)) [生产数],
SUM(Isnull(packQty,0)) [入库数],
SUM(planQty-Isnull(injQty,0)) [偏差数]
From t_injPOhis
WHERE planDate between '2013-7-1' AND '2013-7-31'
Group By pno,planDate
Order By pno,planDate


查询结果:
J001PJ60F5402 13/07/07 45000 0 0 45000
J001PJ60F5402 13/07/08 40000 0 0 40000
J001RJ8006101 13/07/01 45000 43200 72700 1800
J001RJ8006101 13/07/07 45000 43844 40000 1156
。。。。。。

现在要把上述查询结果按产品、数据类型(计划数、生产数、入库数、偏差数)分组 转为:

产品 类型 13-07-01 13-07-02 13-07-07 13-07-08

J001PJ60F5402 计划数 0 0 45000 40000
J001PJ60F5402 生产数 0 0 0 0
J001PJ60F5402 入库数 0 0 0 0
J001PJ60F5402 偏差数 0 0 45000 40000

J001RJ8006101 计划数 45000 0 45000 0
J001RJ8006101 生产数 43200 0 43844 0
J001RJ8006101 入库数 72700 0 40000 0
J001RJ8006101 偏差数 1800 0 1156 0

。。。。。。


...全文
99 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
唐诗三百首 2013-07-08
  • 打赏
  • 举报
回复
估计没办法,因为第1个语句统计后的日期个数是不固定的.
wuyongbiao 2013-07-08
  • 打赏
  • 举报
回复
楼上兄弟:有没有办法直接放在一个SQL语句执行?
唐诗三百首 2013-07-08
  • 打赏
  • 举报
回复

Select pno [产品],Convert(varchar(100), planDate,11) [日期],
 SUM(planQty) [计划数],
 SUM(Isnull(injQty,0)) [生产数],
 SUM(Isnull(packQty,0)) [入库数],
 SUM(planQty-Isnull(injQty,0)) [偏差数]
 into #t
 From t_injPOhis 
 WHERE planDate between  '2013-7-1' AND '2013-7-31' 
 Group By pno,planDate 
 Order By pno,planDate

-- 造测试数据
create table #t
([产品] varchar(20),
 [日期] varchar(12),
 [计划数] int,
 [生产数] int,
 [入库数] int,
 [偏差数] int
)

insert into #t
  select 'J001PJ60F5402', '13/07/02', 45000, 0, 0, 45000 union all
  select 'J001PJ60F5402', '13/07/08', 40000, 0,	0, 40000 union all	
  select 'J001RJ8006101', '13/07/01', 45000, 43200,	72700, 1800	union all
  select 'J001RJ8006101', '13/07/07', 45000, 43844,	40000, 1156	



declare @tsql varchar(6000)

select @tsql='with t as
(select [产品],t ''类型'',[日期],v
  from #t a
  unpivot(v for t in([计划数],[生产数],[入库数],[偏差数])) up
)
select [产品],cast([类型] as varchar(16)) [类型],'+stuff((select ',isnull(['+[日期]+'],0) '''+[日期]+''' ' from (select distinct [日期] from #t) t for xml path('')),1,1,'') 
+' from t b
   pivot(max(v) for [日期] in('+stuff((select ',['+[日期]+']' from (select distinct [日期] from #t) t for xml path('')),1,1,'')+ ') ) p
   order by [产品] '

exec(@tsql)

/*
产品                   类型               13/07/01    13/07/02    13/07/07    13/07/08
-------------------- ---------------- ----------- ----------- ----------- -----------
J001PJ60F5402        计划数              0           45000       0           40000
J001PJ60F5402        偏差数              0           45000       0           40000
J001PJ60F5402        入库数              0           0           0           0
J001PJ60F5402        生产数              0           0           0           0
J001RJ8006101        计划数              45000       0           45000       0
J001RJ8006101        偏差数              1800        0           1156        0
J001RJ8006101        入库数              72700       0           40000       0
J001RJ8006101        生产数              43200       0           43844       0

(8 row(s) affected)
*/
Andy__Huang 2013-07-08
  • 打赏
  • 举报
回复
这里有很多例子,请参考: http://blog.csdn.net/hdhai9451/article/details/5026933

22,209

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧