再次需要帮助。
我有一个表(为简单起见),其中包含3个字段。
code id letter
1 2016 Pablo A
2 2017 Pablo B
3 2016 Ana B
4 2017 Pablo A
5 2018 Ana A
6 2018 Ana A
我需要一个查询结果
code id letterA letterB
1 2016 Pablo 1 Null
2 2017 Pablo 1 1
3 2016 Ana Null 1
4 2018 Ana 2 Null
如您所见,我对ID的记录进行计数并按代码进行分组,如果它们的代码字母不同,则会显示一条新记录,但是如果两个字母都在同一代码上,则只是一条记录。
我尝试了UNION,但是得到的是两个记录(具有相同的代码),它们的字母不同。
谢谢大家
编辑一个:
带有并集的查询
select code, id, count(id), 'letter A' letter
from table
where letter = 'A'
union
select code, id, count(id), 'letter B' letter
from table
where letter = 'B'
我有这样的东西
code id count(id) letter
1 2016 Pablo 1 A
2 2017 Pablo 1 A
3 2017 Pablo 1 B
4 2016 Ana 1 B
5 2018 Ana 2 A
问题是我有2个ID为Pablo的代码2017,我希望只有1个
答案 0 :(得分:2)
您几乎明白了。您只需要另一个GROUP BY
即可获得所需的结果。
使用PIVOT
select *
from tbl t
pivot
(
count(letter)
for letter in ([A], [B])
) p
order by id desc, code
使用Union All
select code, id, A = sum(A), B = sum(B)
from
(
select code, id, A = count(*), B = null
from tbl t
where letter = 'A'
group by code, id
union all
select code, id, A = null, B = count(*)
from tbl t
where letter = 'B'
group by code, id
) d
group by code, id
order by id desc, code
答案 1 :(得分:2)
您可以通过执行动态sql查询来执行此操作,而不是显式给出值。
查询
declare @sql as varchar(max);
select @sql = 'select [code], [id], ' + stuff((
select distinct ', sum(case [letter] when ' + char(39) + [letter] + char(39)
+ ' then 1 else 0 end) as [letter' + [letter] + '] '
from [dbo].[your_table_name]
for xml path('')
)
, 1, 2, ''
);
select @sql += ' from [dbo].[your_table_name] group by [code], [id] order by [id];';
exec(@sql);
答案 2 :(得分:1)
其他方法是通过对行进行分组来在CASE
中使用SELECT
表达式。
select code,
id,
SUM(CASE WHEN letter= 'A' THEN 1 ELSE 0 END) AS 'letter A' ,
SUM(CASE WHEN letter= 'B' THEN 1 ELSE 0 END) AS 'letter B'
from table
group by code, id
注意:如果没有字母,则返回0而不是NULL
。