我正在SQL Server中做一個有診斷代碼的專案,一個病人最多可以有4個代碼,但不一定超過1個,一個病人不能重復一個代碼超過一次。然而,代碼可以以任何順序出現。我的目標是能夠計算一個診斷代碼總共出現了多少次,以及它在某個設定位置出現的頻率。
我的資料目前類似于以下內容:
我的資料目前類似于以下內容。
| Pt鍵 | 訂單# | 訂購日期 | 診斷1診斷2診斷3診斷4345 | 1527 | 7/12/20J44.9 | R26.2 |
|---|---|---|
| 367 | 1679 | |
| 1679 | 7/12/20R26.2 |
我認為最好的方法是在這里創建一個假列,它將通過位置匹配診斷。例如,診斷1與A,診斷2與B,等等。
我目前的計劃是使用unpivot來卷起診斷。 UNPIVOT ( Diag for ColumnALL IN (Diagnosis1, Diagnosis2, Diagnosis3, Diagnosis4)) as unpvt
然而,這仍然沒有提供一種方法來按銷售訂單上的位置計算診斷。
我希望它看起來像這樣:
uj5u.com熱心網友回復:
你可以使用apply和聚合來取消透視:
select v.difference, count(*) as cnt,
sum(case when pos = 1 then 1 else 0 end) as pos_1,
sum(case when Pos = 2 then 1 else 0 end) as pos_2,
sum(case when Pos = 3 then 1 else 0 end) as pos_3,
sum(case when Pos = 4 then 1 else 0 end) as pos_4
from data d cross apply
(values (diagnosis1, 1),
(diagnosis2, 2)。
(診斷3,3)。)
(diagnosis4, 4)
) v(diagnation, pos)
where diagnosis is not null。
uj5u.com熱心網友回復:
另一種方法是使用UNPIVOT來將列轉化為可分組的物體:
SELECT Diagnosis, [Total Count] = COUNT(*)。
[Diag1計數] = SUM(CASE WHEN DiagGroup = N'Diagnosis1' THEN 1 ELSE 0 END)。)
[Diag2計數] = SUM(CASE WHEN DiagGroup = N'Diagnosis2' THEN 1 ELSE 0 END)。)
[Diag3計數] = SUM(CASE WHEN DiagGroup = N'Diagnosis3' THEN 1 ELSE 0 END)。)
[Diag4計數] = SUM(CASE WHEN DiagGroup= N'Diagnosis4' THEN 1 ELSE 0 END)
FROM[/span
(
SELECT * FROM #x UNPIVOT(診斷FOR DiagGroup IN
([Diagnosis1],[Diagnosis2],[Diagnosis3],[Diagnosis4]))起來。
) AS x GROUP BY Diagnosis;
- 示例 db<>fiddle
uj5u.com熱心網友回復:
你也可以在做條件聚合之前通過UNION手動取消透視:
SELECT Diagnosis, COUNT(*) As Total Count
, SUM(CASE WHEN Position = 1 THEN 1 ELSE 0 END) As [Diag1 Count] 。
, SUM(CASE WHEN Position = 2 THEN 1 ELSE 0 END) As [Diag2 Count] 。
, SUM(CASE WHEN Position = 3 THEN 1 ELSE 0 END) As [Diag3 Count] 。
, SUM(CASE WHEN Position = 4 THEN 1 ELSE 0 END) As [Diag4 Count] 。
FROM
(
SELECT PtKey, Diagnosis1 As Diagnosis, 1 As Position
FROM [MyTable]
UNIONALL
SELECT PtKey, Diagnosis2 As Diagnosis, 2 As Position
FROM [MyTable]
WHERE Diagnosis2 IS NOT NULL
UNIONALL
SELECT PtKey, Diagnosis3 As Diagnosis, 3 As Position
FROM [MyTable]
WHERE Diagnosis3 IS NOT NULL
UNIONALL
SELECT PtKey, Diagnosis4 As Diagnosis, 4 As Position
FROM [MyTable]
WHERE Diagnosis4 IS NOT NULLGROUP BY Diagnosis
借用Aaron的方法,以避免需要從頭開始重建模式,我們得到這樣的結果:
https://dbfiddle.uk/?rdbms=sqlserver_2019&fiddle=d1f7f525e175f0f066dd1749c49cc46d
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/322131.html
標籤:
上一篇:為表使用一個隨機的ID,而不是PRIMARYKEYAUTOINCREMENT,以避免客戶知道記錄的數量。
下一篇:繼承SQL中的選擇陳述句
