计算分组值

时间:2018-10-12 21:37:36

标签: sql sql-server

再次需要帮助。

我有一个表(为简单起见),其中包含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个

3 个答案:

答案 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