簡體   English   中英

如何在SQL中求和

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM