[英]How to sum a count in SQL
我剛開始使用PL / SQL Developer,並且嘗試使用Google數小時以解決問題,但無濟於事。
這是我的查詢:
SELECT "STATION_CODE", "STATUS", COUNT(1)
FROM "Table" "R"
WHERE "STATUS" IN ('LOOKUP CLEAR')
AND
NOT ("REQUEST_TYPE" IN ('Goodnight', 'Freeform', 'CANCEL'))
AND
"CALL_DATE" BETWEEN TO_DATE('07/12/2015','DD/MM/YYYY')
AND
TO_DATE ('13/12/2015 23:59:59','DD/MM/YYYY HH24:MI:SS')
AND
"STATION_CODE" IN ('Code1','Code2','Code3','Code4','Code5','Code6','Code7')
GROUP BY "STATION_CODE", "STATUS";
結果:
+----------------------------------------+
| Results |
+----------------------------------------+
| Station_Code | Status | Count(1) |
+--------------+--------------+----------+
| Code1 | Filter Clear | 5 |
+--------------+--------------+----------+
| Code2 | Filter Clear | 2 |
+--------------+--------------+----------+
| Code3 | Filter Clear | 5 |
+--------------+--------------+----------+
| Code4 | Filter Clear | 10 |
+--------------+--------------+----------+
| Code5 | Filter Clear | 3 |
+--------------+--------------+----------+
| Code6 | Filter Clear | 8 |
+--------------+--------------+----------+
| Code7 | Filter Clear | 2 |
+--------------+--------------+----------+
我想要的是總和作為計數的最后一行。 類似於以下內容:
+--------------+--------------+----------+
| Sum | | 35 |
+--------------+--------------+----------+
我相信有一個“具有”功能需要使用,但我無法終生解決。
我不確定這是否相關,但是我擁有的數據庫連接是只讀視圖。
先謝謝您的幫助!
GROUPING SETS
最簡單的解決方案是在GROUP BY
子句中使用GROUPING SETS
:
SELECT DECODE(GROUPING_ID("STATION_CODE"), 0, "STATION_CODE", 'Sum'), "STATUS", COUNT(1)
FROM "Table" "R"
WHERE "STATUS" IN ('LOOKUP CLEAR')
AND NOT ("REQUEST_TYPE" IN ('Goodnight', 'Freeform', 'CANCEL'))
AND "CALL_DATE" BETWEEN TO_DATE('07/12/2015','DD/MM/YYYY')
AND TO_DATE ('13/12/2015 23:59:59','DD/MM/YYYY HH24:MI:SS')
AND "STATION_CODE" IN ('Code1','Code2','Code3','Code4','Code5','Code6','Code7')
GROUP BY GROUPING SETS (("STATION_CODE", "STATUS"), ());
這將產生
+----------------------------------------+
| Results |
+----------------------------------------+
| Station_Code | Status | Count(1) |
+--------------+--------------+----------+
| Code1 | Filter Clear | 5 |
+--------------+--------------+----------+
| Code2 | Filter Clear | 2 |
+--------------+--------------+----------+
| Code3 | Filter Clear | 5 |
+--------------+--------------+----------+
| Code4 | Filter Clear | 10 |
+--------------+--------------+----------+
| Code5 | Filter Clear | 3 |
+--------------+--------------+----------+
| Code6 | Filter Clear | 8 |
+--------------+--------------+----------+
| Code7 | Filter Clear | 2 |
+--------------+--------------+----------+
| Sum | | 35 |
+--------------+--------------+----------+
另外,您可以做的是使用窗口函數(在Oracle中也稱為分析函數)來聚合一個聚合函數。 以下查詢將起作用:
SELECT "STATION_CODE", "STATUS", COUNT(1), SUM(COUNT(1)) OVER()
FROM "Table" "R"
WHERE "STATUS" IN ('LOOKUP CLEAR')
AND NOT ("REQUEST_TYPE" IN ('Goodnight', 'Freeform', 'CANCEL'))
AND "CALL_DATE" BETWEEN TO_DATE('07/12/2015','DD/MM/YYYY')
AND TO_DATE ('13/12/2015 23:59:59','DD/MM/YYYY HH24:MI:SS')
AND "STATION_CODE" IN ('Code1','Code2','Code3','Code4','Code5','Code6','Code7')
GROUP BY "STATION_CODE", "STATUS";
它將產生:
+---------------------------------------------------------------+
| Results |
+---------------------------------------------------------------+
| Station_Code | Status | Count(1) | Sum(Count(1)) Over() |
+--------------+--------------+----------+----------------------+
| Code1 | Filter Clear | 5 | 35 |
+--------------+--------------+----------+----------------------+
| Code2 | Filter Clear | 2 | 35 |
+--------------+--------------+----------+----------------------+
| Code3 | Filter Clear | 5 | 35 |
+--------------+--------------+----------+----------------------+
| Code4 | Filter Clear | 10 | 35 |
+--------------+--------------+----------+----------------------+
| Code5 | Filter Clear | 3 | 35 |
+--------------+--------------+----------+----------------------+
| Code6 | Filter Clear | 8 | 35 |
+--------------+--------------+----------+----------------------+
| Code7 | Filter Clear | 2 | 35 |
+--------------+--------------+----------+----------------------+
最后但並非最不重要的一點是,您可以匯總嵌套選擇中的計數總和。 這樣,您將只得到總和:
SELECT SUM(c)
FROM (
SELECT COUNT(1) c
FROM "Table" "R"
WHERE "STATUS" IN ('LOOKUP CLEAR')
AND NOT ("REQUEST_TYPE" IN ('Goodnight', 'Freeform', 'CANCEL'))
AND "CALL_DATE" BETWEEN TO_DATE('07/12/2015','DD/MM/YYYY')
AND TO_DATE ('13/12/2015 23:59:59','DD/MM/YYYY HH24:MI:SS')
AND "STATION_CODE" IN ('Code1','Code2','Code3','Code4','Code5','Code6','Code7')
GROUP BY "STATION_CODE", "STATUS"
)
在這種情況下, 戈登·利諾夫(Gordon Linoff)的答案可能更好。
刪除group by
然后進行總體計數:
SELECT COUNT(1)
FROM "Table" "R"
WHERE "STATUS" IN ('LOOKUP CLEAR') AND
NOT ("REQUEST_TYPE" IN ('Goodnight', 'Freeform', 'CANCEL')) AND
"CALL_DATE" BETWEEN TO_DATE('07/12/2015','DD/MM/YYYY') AND
TO_DATE ('13/12/2015 23:59:59','DD/MM/YYYY HH24:MI:SS') AND
"STATION_CODE" IN ('Code1', 'Code2', 'Code3', 'Code4', 'Code5', 'Code6', 'Code7') ;
您可以嘗試以下方法:
with alldata as (
SELECT "STATION_CODE", "STATUS", COUNT(1) as counts
FROM "Table" "R"
WHERE "STATUS" IN ('LOOKUP CLEAR')
AND NOT ("REQUEST_TYPE" IN ('Goodnight', 'Freeform', 'CANCEL'))
AND "CALL_DATE" BETWEEN TO_DATE('07/12/2015','DD/MM/YYYY')
AND TO_DATE ('13/12/2015 23:59:59','DD/MM/YYYY HH24:MI:SS')
AND "STATION_CODE" IN ('Code1','Code2','Code3','Code4','Code5','Code6','Code7')
GROUP BY "STATION_CODE", "STATUS";
)
select station_code, status, counts from alldata
union all
select 'Sum', ' ', sum(counts) from alldata
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.