作者grence (多想两分钟 = =")
看板Database
标题Re: [SQL ] 两个资料表要产出数字 (count)
时间Wed Jun 10 21:04:44 2009
※ 引述《sai25 (hyde)》之铭言:
: 请问一下PIVOT用法
: select * from (select B.declare_name,count(A.type) 人数 from @t2 A,@t B
: where A.type = B.declare_no group by B.declare_name,B.declare_no ) as x pivot
: (sum(人数) for declare_name in
: ([定期申报],[就职申报],[补正申报],[动态申报],[信托申报])) AS PVT
: 以上栏位都要把[XXXX]打出来吗?
: 有没有办法不用打出栏位 [定期申报],[就职申报],[补正申报],[动态申报],[信托申报]
没有,但可以动态产生栏位....
declare @s nvarchar(max)
select @s=isnull(@s+',','')+quotename([declare_name])
from @t
group by[declare_name]
这样 @s的内容是"[定期申报],[就职申报],[补正申报],[动态申报],[信托申报]"
再把 @s串进 SQL用 exec('...')去执行…
手边没资料库可以测试,SQL借抠一下
declare @s nvarchar(max)
select @s=isnull(@s+',','')+quotename([declare_name])
from @t
group by[declare_name]
exec(
'select * from (select B.declare_name,count(A.type) 人数 from @t2 A,@t B
where A.type = B.declare_no group by B.declare_name,B.declare_no ) as x
pivot
(sum(人数) for declare_name in('
--以上复制贴上前後加单引号
+@s+
--以下复制贴上删掉'[定期申报],..,[信托申报]'前後加单引号
')) AS PVT'
)
: ※ 引述《grence (多想两分钟 = =")》之铭言:
: : SELECT *
: : FROM @t2
: : left join @t on type=declare_no
: : select *,
: : case declare_name when '定期申报' then 1 else 0 end[定期申报],
: : case declare_name when '就职申报' then 1 else 0 end[就职申报],
: : case declare_name when '补正申报' then 1 else 0 end[补正申报],
: : case declare_name when '动态申报' then 1 else 0 end[动态申报],
: : case declare_name when '信托申报' then 1 else 0 end[信托申报]
: : FROM @t2
: : left join @t on type=declare_no
: : select
: : sum(case declare_name when '定期申报' then 1 else 0 end)[定期申报],
: : sum(case declare_name when '就职申报' then 1 else 0 end)[就职申报],
: : sum(case declare_name when '补正申报' then 1 else 0 end)[补正申报],
: : sum(case declare_name when '动态申报' then 1 else 0 end)[动态申报],
: : sum(case declare_name when '信托申报' then 1 else 0 end)[信托申报]
: : FROM @t2
: : left join @t on type=declare_no
: : /*
: : 写法想精简一点可以查 pivot用法
: : 我实验的结果是效率没比较好,也没比较好读…
: : */
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 61.229.201.177