我在SQL Server中有一個大型資料集,其中包含兩個日期欄位和一個外鍵欄位(除其他外):
---- --------- ------------- -------------
| id | type_id | report_date | import_date |
---- --------- ------------- -------------
| 1 | 1 | 2021-08-01 | 2021-08-02 |
| 2 | 1 | 2021-08-01 | 2021-08-02 |
| 3 | 2 | 2021-08-01 | 2021-08-02 |
| 4 | 2 | 2021-08-04 | 2021-08-05 |
| 5 | 1 | 2021-08-04 | 2021-08-05 |
| 6 | 3 | 2021-08-04 | 2021-08-05 |
| 7 | 2 | 2021-08-04 | 2021-08 -04 |
---- --------- ------------- -------------
我需要一個可以計算每一天的行數的查詢,但是要對type_id列中的每個不同的值進行計算。我現在能想到的最接近的方法是回傳某個特定日期的所有行的總計數:
select count(REPORT_DATE) as records,
REPORT_DATE as report_date
from MY_TABLE
group by REPORT_DATE;
我如何將其分割,以便為type_id的每個值回傳一個額外的列?例如:
------------ --------- --------- >
| date | count_1 | count_2 | count_3 |
------------ --------- --------- ---------
| 20210801 | 2 | 1 | 0 |
| 2021-08-04 | 1 | 2 | 1 |
------------ --------- --------- ---------
我想我至少需要一個子查詢,但這超出了我目前的知識范圍。
uj5u.com熱心網友回復:
你可以使用一個PIVOT或者一個條件聚合。
PIVOT:
;WITH src as
(
SELECT report_date, type_id, c = COUNT(*)
FROM dbo.MY_TABLE
GROUP BY report_date, type_id
)
SELECT report_date,
count_1 = COALESCE([1], 0) 。
count_2 = COALESCE([2], 0) 。
count_3 = COALESCE([3], 0)
FROM src
PIVOT (MAX(c) FOR type_id IN ( [1], [2], [3]) AS p。
條件聚合:
SELECT report_date,
count_1 = SUM(CASE WHEN type_id= 1 THEN 1 ELSE 0 END)。)
count_2 = SUM(CASE WHEN type_id = 2 THEN 1 ELSE 0 END)。)
count_3 = SUM(CASE WHEN type_id = 3 THEN 1 ELSE 0 END)
FROM dbo.MY_TABLE
GROUP BY report_date;
示例 db<>fiddle
使用任何一個對你來說更直觀的學習和理解的方法,盡管我想說條件聚合肯定更容易維護,例如,當type_id = 4出現以后,正如@jarlh在評論中建議的那樣。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/311052.html
標籤:
