求一SQL语句

tqqonline 2012-07-27 10:20:31
表中
年份 部门名 动作
2012 A 出差
2012 B 出差
2012 B 出国
2012 B 出国
2011 A 出差
2011 A 出国
2011 B 出差

如何得到以下结果:(求SQL语句)
年份 A B
2012 1 3
2011 2 1

...全文
84 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
create table test([年份] varchar(30), [部门名] varchar(50), [动作] varchar(50))
go
insert test
select '2012', 'A', '出差' union all
select '2012', 'B','出差' union all
select '2012', 'B', '出国' union all
select '2012', 'B', '出国' union all
select '2011', 'A', '出差' union all
select '2011', 'A', '出国' union all
select '2011', 'B', '出差'

select * from test

declare @sql varchar(max)
declare @sql2 varchar(500)

select @sql=isnull(@sql+',','')+'(case when [部门名]='''+[部门名]+''' then [动作] end) as '+t.[部门名]
,@sql2=isnull(@sql2+',','')+'count(['+t.[部门名]+']) as '''+t.[部门名]+''''
from
( select distinct [部门名] from test ) t


set @sql='select [年份], '+@sql2+' FROM (select [年份],'+@sql+' from test) t group by t.[年份]'

exec(@sql)

drop table test

/*
(7 row(s) affected)
年份 部门名 动作
------------------------------ -------------------------------------------------- --------------------------------------------------
2012 A 出差
2012 B 出差
2012 B 出国
2012 B 出国
2011 A 出差
2011 A 出国
2011 B 出差

(7 row(s) affected)

年份 A B
------------------------------ ----------- -----------
2011 2 1
2012 1 3
(2 row(s) affected)
*/
NET_2011 2012-07-27
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 的回复:]

SQL code

DECLARE @sql NVARCHAR(4000)
SET @sql='select 年份'
SELECT @sql=@sql+','+部门名 FROM 表 GROUP BY 部门名
EXEC(@sql+' from 表 group by 年份 order by 年份 desc')
[/Quote]
手误改改

DECLARE @sql NVARCHAR(4000)
SET @sql='select 年份'
SELECT @sql=@sql+','+部门名+'=sum(case when 部门名='''+部门名+''' then 1 else 0 end)' FROM 表 GROUP BY 部门名
EXEC(@sql+' from 表 group by 年份 order by 年份 desc')


其它方法参照
http://topic.csdn.net/u/20080614/17/22e73f33-f071-46dc-b9bf-321204b1656f.html?seed=562318242
孤独加百列 2012-07-27
  • 打赏
  • 举报
回复
部门名不固定

IF EXISTS (SELECT 1 FROM SYSOBJECTS WHERE name = 'tba')
BEGIN
DROP TABLE tba
END
GO
CREATE TABLE tba
(
年份 INT,
部门名 VARCHAR(10),
动作 VARCHAR(10)
)
GO
INSERT INTO tba
SELECT 2012, 'A', '出差' UNION ALL
SELECT 2012, 'B', '出差' UNION ALL
SELECT 2012, 'B', '出国' UNION ALL
SELECT 2012, 'B', '出国' UNION ALL
SELECT 2011, 'A', '出差' UNION ALL
SELECT 2011, 'A', '出国' UNION ALL
SELECT 2011, 'B', '出差'
GO

DECLARE @sql VARCHAR(4000)
SET @sql='SELECT 年份'
SELECT @sql=@sql + ',SUM(CASE WHEN 部门名 = ''' + 部门名 + ''' THEN 1 ELSE 0 END) AS ' + 部门名 FROM tba GROUP BY 部门名
EXEC(@sql+' FROM tba GROUP BY 年份 ORDER BY 年份 DESC')

年份 A B
2012 1 3
2011 2 1

固定用1楼就可以
NET_2011 2012-07-27
  • 打赏
  • 举报
回复

DECLARE @sql NVARCHAR(4000)
SET @sql='select 年份'
SELECT @sql=@sql+','+部门名 FROM 表 GROUP BY 部门名
EXEC(@sql+' from 表 group by 年份 order by 年份 desc')
NET_2011 2012-07-27
  • 打赏
  • 举报
回复
select 
年份
,sum(case when 部门名='A' then 1 else 0 end) as A
,sum(case when 部门名='B' then 1 else 0 end) as B
from 表
group by 年份
--小F-- 2012-07-27
  • 打赏
  • 举报
回复
select
年份,
sum(case when 部门名='A' then 1 else 0 end) as 'A',
sum(case when 部门名='B' then 1 else 0 end) as 'B'
from
tb
group by
年份

34,590

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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