2014-10-20 66 views
0

我有一個表,在essencwe看起來像這樣的行:獲取的分組計數由符合特定條件

╔═════════╦═══════╦══════╗ 
║ Balance ║ Limit ║ Type ║ 
╠═════════╬═══════╬══════╣ 
║ 6 ║ 2 ║ 1 ║ 
║ 3 ║ 3 ║ 2 ║ 
║ 2 ║ 5 ║ 2 ║ 
╚═════════╩═══════╩══════╝ 

現在,我想要做的是計算餘額,按類型,然後返回分組「違規」類型的數量。也就是說,如果它的總餘額不高於該類型的最高現值限額。

因此,在上面的例子(看着極限和類型,這是一個固定的結構:

在第1所需要的平衡,爲至少3和平衡在2和3只需要爲總和至少6

因此,我希望我的查詢返回1(表示有一個類型,其歸結餘額過低)。

當然,如果表是空的,我希望有一個零返回

我該如何做到這一點?與之前類似,但不需要按類型進行分組。因此,我會做得一樣:

SELECT Rowcount = COUNT(IIF (Balance - Limit < 1, 1, NULL)) FROM Table 

回答

2

首先,您需要每個類型,讓您的上限:

SELECT Balance, 
     Limit = MAX(Limit) OVER(PARTITION BY Type), 
     Type 
FROM [Table]; 

然後你就可以在你的計數使用這個上限,不幸的是你不能放置窗口函數裏面COUNT所以你需要使用子查詢,則只能算不同的類型:

SELECT [RowCount] = COUNT(DISTINCT Type) 
FROM ( SELECT Balance, 
        Limit = MAX(Limit) OVER(PARTITION BY Type), 
        Type 
      FROM [Table] 
     ) AS t 
WHERE Balance <= Limit; 

你也可能也只是移動的標準,因爲到WHERE,因爲你沒有執行任何其他計數。


編輯

我可能比這複雜。您可以通過type在子查詢,以獲得最大極限,剩餘的總和組,然後計算該子查詢的結果:

SELECT [RowCount] = COUNT(Type) 
FROM ( SELECT Balance = SUM(Balance), 
        Limit = MAX(Limit), 
        Type 
      FROM [Table] 
      GROUP BY Type 
     ) AS t 
WHERE Balance <= Limit; 

或者:

SELECT [RowCount] = COUNT(Type) 
FROM ( SELECT Type 
      FROM [Table] 
      GROUP BY Type 
      HAVING SUM(Balance) <= MAX(Limit) 
     ) AS t 
+0

這似乎幾乎是世界衛生大會我在追求。但它似乎沒有爲具有相同類型的行添加餘額。也就是說,如果我有兩行數據:(餘額:5,限制:2,類型:1)和(餘額:3,限制:4,類型:1),它會返回1.因爲第二個行低於第2行的限制(在本例中,我想比較5 + 3到4)。 – 2014-10-20 14:32:37

+0

我認爲這可行。美麗,謝謝! – 2014-10-20 14:41:17

0

可能是這個查詢幫助:

SELECT COUNT(Type) AS types_with_too_low_balances_count 
FROM (
    SELECT Type 
    FROM table_name 
    GROUP BY Type 
    HAVING SUM(Balance) <= MAX(Limit) 
) a 

測試它SQL Fiddle

+0

嗯,這似乎總是返回一個0. – 2014-10-20 14:34:41

+0

添加測試SQL小提琴,它返回'1'與您的數據 – Rimas 2014-10-20 14:43:25