2015-12-21 224 views
0

我的數據是結構化數據的組總結: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

回答

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