SQL查询根据条件按数据组汇总

时间:2015-12-21 19:10:59

标签: sql-server distinct grouping

我的数据结构如下:

Call_Num    Country     Item_Num     Date
  XXX1        GG          1         26-Dec
  XXX1        GG          2          
  YYY1        FF          1         2-Jan
  ZZZ1        HH          1         
  ZZZ1        HH          2              
  YYY1        II          1         3-Jan
  YYY1        II          2         3-Jan

我的目标是获得一个DISTINCT计数为Call_Num的汇总表,如下所示:

Country    Calls_with_date      Calls_with_partial_date   Calls_with_no_date
 GG               0                         1                      0
 FF               1                         0                      0
 HH               0                         0                      1
 II               1                         0                      0

如何使用查询在SQL Server中完成此操作。我可以在日期字段的所有实例中得到它而没有足够简单的日期。但是,对于我来说,将这种分组也变得有点困难。

假设:

a)每个国家/地区将有超过1个call-num。为简单起见,我提到了一个简单的例子。

b)我知道在汇总到上面给出的新表时,我们可能需要每列使用一个查询。所以上面的答案可能是三个查询,其中有类似的逻辑。

c)没有日期,我的意思是所有出现的call_num都没有指定日期。部分地,我的意思是指定一个或多个日期。

d)我在摘要中只计算一个呼叫,即使表中有多个呼叫,因为每个呼叫可以有多个项目,并且每个项目都可以有一个日期。我关注整个call_num,因此摘要中的分割。

提前感谢您的时间和帮助。

1 个答案:

答案 0 :(得分:0)

以下是我将如何做的伪代码:

SELECT 
  SUM(
   CASE 
    WHEN Date IS NOT NULL AND NOT EXISTS(SELECT * FROM MyTable WHERE {SameCountry, SameCallNum} AND Date IS NULL OR (Date IS NOT NULL AND {Item_Num is lower than this one}))
    THEN 1
    ELSE 0
   END
  ) AS Calls_with_date
, SUM(
   CASE 
    WHEN Date IS NOT NULL AND EXISTS(SELECT * FROM MyTable WHERE {SameCountry, SameCallNum} AND Date IS NULL)
    AND NOT EXISTS (SELECT * MyTable WHERE {SameCountry, SameCallNum} AND Date IS NOT NULL AND {Item_Num is lower than this one})
    THEN 1
    ELSE 0
   END
  ) AS Calls_with_partial_date
, SUM(
   CASE 
    WHEN Date IS NULL AND NOT EXISTS(SELECT * FROM MyTable WHERE {SameCountry, SameCallNum} AND Date IS NOT NULL OR (Date IS NULL AND {Item_Num is lower than this one}))
    THEN 1
    ELSE 0
   END
  ) AS Calls_with_no_date
FROM MyTable
GROUP BY Country