2017-09-20 88 views
0

我有一個UserID和付款金額的表。我想彙總所有UserID的付款,然後將它們分組到範圍中。 「中等」(500英鎊到4999英鎊)和「大」(5000英鎊+)按SUM值範圍分組SQL

因此,如果用戶標識已經支付了4英鎊100那麼他就會出現用戶名:76867範圍金額「小」

我當前的查詢給我的每一個用戶名和範圍的總分爲

SELECT 
SERIALNUMBER , Case when SUM(BATCHDETAIL.PAYMENTAMOUNT) > 1 and SUM(BATCHDETAIL.PAYMENTAMOUNT) < 500 then 'small' when SUM(BATCHDETAIL.PAYMENTAMOUNT) > 499 and SUM(BATCHDETAIL.PAYMENTAMOUNT) < 5000 then 'medium' when SUM(BATCHDETAIL.PAYMENTAMOUNT) > 5000 and SUM(BATCHDETAIL.PAYMENTAMOUNT) < 10000000 then 'large' END AS 'Sum of PAYMENTAMOUNT' 
FROM BATCHDETAIL 
WHERE (DATEOFPAYMENT > '2017/07/31') AND (DATEOFPAYMENT < '2018/08/01') 
GROUP BY SERIALNUMBER 

但我需要現在是總結多少用戶ID屬於每個範圍

Range | Count of UserIDs 
-------|---------------- 
Small |  23 
-------|---------------- 
Medium |  08 

(道歉爲格式不好)。任何幫助/問題將不勝感激一如既往! 謝謝 Lee

+1

首先找出您正在使用的RDBMS。 – Strawberry

回答

0

你可以把你的select語句放到子查詢中。我假定Serialnumber是一個用戶標識,並且你想要統計每個組中不同的用戶。

 Select [Sum of PAYMENTAMOUNT] as 'Range', 
count(distinct Serialnumber) as 'Count of UserIDs' FROM 
      (
      SELECT 
      SERIALNUMBER , 
     Case when SUM(BATCHDETAIL.PAYMENTAMOUNT) > 1 and SUM(BATCHDETAIL.PAYMENTAMOUNT) < 500 then 'small' 
     when SUM(BATCHDETAIL.PAYMENTAMOUNT) > 499 and SUM(BATCHDETAIL.PAYMENTAMOUNT) < 5000 then 'medium' 
     when SUM(BATCHDETAIL.PAYMENTAMOUNT) > 5000 and SUM(BATCHDETAIL.PAYMENTAMOUNT) < 10000000 then 'large' END AS 'Sum of PAYMENTAMOUNT' 
      FROM BATCHDETAIL 
      WHERE (DATEOFPAYMENT > '2017/07/31') AND (DATEOFPAYMENT < '2018/08/01') 
     GROUP BY SERIALNUMBER 
     ) s 
group by [Sum of PAYMENTAMOUNT] 
+0

謝謝,這也給了我想要的東西:) – wolfgang

0

您可以使用原始選擇定義CTE(公用表表達式),以便您可以輕鬆地將其結果分組以計算每個範圍的外觀。

with Ranges as 
(
    SELECT SERIALNUMBER , Case when SUM(BATCHDETAIL.PAYMENTAMOUNT) > 1 and SUM(BATCHDETAIL.PAYMENTAMOUNT) < 500 then 'small' when SUM(BATCHDETAIL.PAYMENTAMOUNT) > 499 and SUM(BATCHDETAIL.PAYMENTAMOUNT) < 5000 then 'medium' when SUM(BATCHDETAIL.PAYMENTAMOUNT) > 5000 and SUM(BATCHDETAIL.PAYMENTAMOUNT) < 10000000 then 'large' END AS 'Sum of PAYMENTAMOUNT' 
    FROM BATCHDETAIL 
    WHERE (DATEOFPAYMENT > '2017/07/31') AND (DATEOFPAYMENT < '2018/08/01') 
    GROUP BY SERIALNUMBER 
) 

select 'Sum of PAYMENTAMOUNT', count(*) as 'Count of UserIDs' 
from Ranges 
group by 'Sum of PAYMENTAMOUNT' 
+0

我收到了以下錯誤消息:每個GROUP BY表達式都必須包含至少一個不是外部引用的列。 – wolfgang

0

通過它再次

select [Sum of PAYMENTAMOUNT] , count(SERIALNUMBER) 
from (
SELECT 
SERIALNUMBER , Case when SUM(BATCHDETAIL.PAYMENTAMOUNT) > 1 and SUM(BATCHDETAIL.PAYMENTAMOUNT) < 500 then 'small' 
when SUM(BATCHDETAIL.PAYMENTAMOUNT) > 499 and SUM(BATCHDETAIL.PAYMENTAMOUNT) < 5000 then 'medium' 
when SUM(BATCHDETAIL.PAYMENTAMOUNT) > 5000 and SUM(BATCHDETAIL.PAYMENTAMOUNT) < 10000000 then 'large' END AS [Sum of PAYMENTAMOUNT] 
    FROM BATCHDETAIL 
    WHERE (DATEOFPAYMENT > '2017/07/31') AND (DATEOFPAYMENT < '2018/08/01') 
GROUP BY SERIALNUMBER 
) as t1 
group by [Sum of PAYMENTAMOUNT] 
+0

令人驚歎!那正是我想要的。非常感謝! – wolfgang

0

最有效的方法「的PAYMENTAMOUNT總和」用你的查詢作爲子查詢和組將做它在兩個層面(使用子查詢):

select 
    count(*) as cnt 
, Case 
     when a.total_payment >= 10000000 then 'large+' 
     when a.total_payment >= 5000 then 'large' 
     when a.total_payment >= 500 then 'medium' 
     when a.total_payment >= 1 then 'small' 
     else 'too small' 
     end AS "Sum of PAYMENTAMOUNT" 

from (
    SELECT 
     SERIALNUMBER 
    , SUM(BATCHDETAIL.PAYMENTAMOUNT) as total_payment 
    FROM BATCHDETAIL 
    WHERE (DATEOFPAYMENT > '2017/07/31') AND (DATEOFPAYMENT < '2018/08/01') 
    GROUP BY SERIALNUMBER 
) as a 
group by "Sum of PAYMENTAMOUNT" 

順便說一句,你錯過了一些範圍。

+0

謝謝你這麼快回答。我收到了一條錯誤消息,每個GROUP BY表達式都必須包含至少一個不是外部引用的列,並且它不像'a.PAYMENTAMOUNT'那樣也是列名。 – wolfgang

+0

這是因爲我從原始代碼片段中複製了它。對於sql中的列名,你應該使用不是單一的,而是使用雙引號。抱歉沒有立即修復。 – Alex

+0

a-ha我不知道!知道這非常有用! – wolfgang