SQL“组”和“计数”类别

时间:2019-09-24 00:46:48

标签: sql-server-2012

编辑。这是another question的后续内容。为了简化问题。假设一个表

date  | id | type
01/01 |  1 |  F
02/01 |  1 |  F
02/01 |  1 |  F
03/01 |  1 |  S
03/01 |  1 |  S
04/01 |  1 |  F
04/01 |  1 |  S
05/01 |  1 |  S

我正在寻找一种通过每天的交易类型组合来总结上表的方法。如果某人(id)每天只有一笔交易,则算作单一类型。如果它们不止一个,则视为一个。我已经完成了原始查询,并且可以正常运行。上表的输出为:

date  | Single | Multiple
01/01 |   1    |   0
02/01 |   0    |   1
03/01 |   0    |   1
04/01 |   0    |   1
05/01 |   1    |   0

我走了那么远,而且行得通。我正在努力解决的问题(即不知道如何开始)是如何设置查询以显示所有可能的Type组合(SS,FF,FS),而不仅仅是计算多个事务。所需的输出如下:

date  | Single | # FF | # FS | # SS
01/01 |   1    |   0  |   0  |  0
02/01 |   0    |   1  |   0  |  0
03/01 |   0    |   0  |   0  |  1
04/01 |   0    |   0  |   1  |  0
05/01 |   1    |   0  |   0  |  0

任何建设性的提示或想法将不胜感激。

1 个答案:

答案 0 :(得分:1)

这是假设您每个日期最多有2个types

您可以将CASE WHEN语句与MIN()MAX()一起使用来检查FFFSSS

select  [date],
    case when count(*) = 1 then 1 else 0 end as Single,
    case when count(*) >= 2 
         and  min([type]) = 'F'
         and  max([type]) = 'F'
         then 1
         else 0
         end as [# FF],
    case when count(*) >= 2 
         and  min([type]) = 'F'
         and  max([type]) = 'S'
         then 1
         else 0
         end as [# FS],
    case when count(*) >= 2 
         and  min([type]) = 'S'
         and  max([type]) = 'S'
         then 1
         else 0
         end as [# SS]
from    yourtable
group by [date]

编辑: 对于3种以上的类型,只要将count(*) = 2count(*) >= 2type

,就将F更改为S