22,301
社区成员




create table work (姓名 varchar(20),性别 varchar(20),班次 varchar(20))
insert into work values ('小明','男','早班')
insert into work values ('小李','女','早班')
insert into work values ('小陈','男','早班')
insert into work values ('小康','男','中班')
insert into work values ('小孙','男','中班')
insert into work values ('小王','男','晚班')
insert into work values ('小刘','女','晚班')
select 班次,男,女 from work pivot (count(姓名) for 性别 in (男,女))t
SELECT
班次
,COUNT(CASE WHEN 性别=N'男' THEN 姓名 END) AS 男
,COUNT(CASE WHEN 性别=N'女' THEN 姓名 END) AS 女
FROM dbo.work
GROUP BY 班次
可这样理解,红色部分再行转列,红色部分不出现重复就不会重复显示
SELECT 班次
,[男] = ISNULL([男] , 0)
,[女] = ISNULL([女] , 0)
FROM ( SELECT 性别
,班次
,COUNT(姓名) AS 姓名
FROM dbo.work
GROUP BY 性别
,班次
) AS A PIVOT ( MAX(姓名) FOR 性别 IN ( [男] , [女] ) ) t;
select 班次,男,女 from work pivot (count(姓名) for 性别 in (男,女))t
我觉得应该显示成以下才对:
班次 男 女
晚班 1 1
晚班 1 1
早班 2 1
早班 2 1
早班 2 1
中班 2 0
中班 2 0
但其实不是,为什么会显示成这样呢?
班次 男 女
晚班 1 1
早班 2 1
中班 2 0
班次 男 女
晚班 1 1
晚班 1 1
早班 2 1
早班 2 1
早班 2 1
中班 2 0
中班 2 0
3、但我不明白为什么此语句select 班次,男,女 from work pivot (count(姓名) for 性别 in (男,女))t
执行后为什么会显示成如下效果:班次 男 女
晚班 1 1
早班 2 1
中班 2 0
而不是显示成2中的效果,因为只是对姓名进行了聚合,性别分成男女两列,但班次并没有动啊,应该是全都显示出来,就是班次中6行内容应该全显示出来,是2中的效果的才对,然后加distinct后才显示为3的效果,是进行了PIVOT后自动去掉了重复的项目吗,还是我没理解对呀?我应该说明白了吧班次 男 女
晚班 1 1
晚班 1 1
早班 2 1
早班 2 1
中班 2 0
select 班次,男,女 from work pivot (count(姓名) for 性别 in (男,女))t
SELECT
班次
,COUNT(CASE WHEN 性别=N'男' THEN 姓名 END) AS 男
,COUNT(CASE WHEN 性别=N'女' THEN 姓名 END) AS 女
FROM dbo.work
GROUP BY 班次
处理在分组加一列区别,数据会显示全为1,比如:
;WITH work2
AS
(
SELECT *,RK=ROW_NUMBER()OVER(PARTITION BY 班次 ORDER BY 班次) FROM dbo.work
)
SELECT 班次
,[男] = ISNULL([男] , 0)
,[女] = ISNULL([女] , 0)
FROM work2 PIVOT ( COUNT(姓名) FOR 性别 IN ( [男] , [女] ) ) t;
/*
班次 男 女
晚班 1 0
晚班 0 1
早班 1 0
早班 0 1
早班 1 0
中班 1 0
中班 1 0
*/select 班次,男,女 from work pivot (count(姓名) for 性别 in (男,女))t
在未加distinct 的情况下,就应该是显示出这个效果:
班次 男 女
晚班 1 1
晚班 1 1
早班 2 1
早班 2 1
早班 2 1
中班 2 0
中班 2 0
但实际上为什么不是呢?SELECT 班次,[男]=ISNULL([男],0),[女]=ISNULL([女],0) FROM (SELECT 性别,班次,COUNT(姓名) AS 姓名 FROM dbo.work GROUP BY 性别,班次) AS A PIVOT (max(姓名) for 性别 in ([男],[女]))t
/*
班次 男 女
晚班 1 1
早班 2 1
中班 2 0
*/