SQL查询,基于条件

问题描述:

我的数据是结构化数据的组总结:SQL查询,基于条件

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 

我的目标是获得与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中使用查询完成的。我可以得到日期字段的所有实例没有足够简单的日期。但为了将这个分组也纳入等式,对我来说证明有点困难。

假设:

一)将有每个国家的超过1呼叫NUM。为了简单起见,我提到了一个简单的例子。

b)我知道,当总结成上面给出的新表时,我们可能需要使用每列的查询。所以上面的答案可能是三个查询,其中有类似的逻辑。 c)由于没有日期,我的意思是call_num的所有出现都没有指定日期。部分,我的意思是一个或多个可能有一个日期分配。

d)即使表格中有多个,我也只统计一个呼叫,因为每个呼叫可以有多个项目,每个项目可以有一个日期。我关注整体call_num,因此总结中出现分歧。

预先感谢您的时间和帮助。

+0

为什么国家GG和HH只对结果一个日期,当你的数据有两行? –

+0

这并不完全清楚你在这里做什么,但一些聚合和计数应该能够很容易地解决这个问题。例如,为什么II有call_with_date = 1,有两行有日期?帮助我们理解规则,并找到解决方案。 –

+0

你好胡安和肖恩。你的担忧是非常有效的,我对没有说得更清楚表示歉意。我只想用不同的call_num来衡量它。每个呼叫可以有多个部分,每个部分可以有不同的日期。我不担心两部分的日期相同。我关心的是同一个call_num的所有项目是否都有日期。如果是这样,则计为1次呼叫。 – Manus

这里是我会怎么做伪代码:

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