我正在努力實作以下要求,但我不明白是否可以使用 sql server。請建議我。
在下表中,每個 ID 可能有 1 個 X 標記或 2 個 X 標記或 3 個 X 標記在其他列中,如下表所示。所以我需要撰寫一個查詢來獲取一個包含所有 X 標記列的新列名。請參考輸出表示例。
表格1
| ID | 當前金額 | 風險評級 | 簡稱 | 沒有例外 | A B C D | EFGH | IJKL | MNOP |
|---|---|---|---|---|---|---|---|---|
| 1010 | 100 | 2 | 約翰·克爾斯普 | 空值 | X | 空值 | 空值 | 空值 |
| 1011 | 200 | 5 | 大衛·斯庫 | 空值 | X | 空值 | 空值 | 空值 |
| 1022 | 300 | 1 | 帕特里克 | 空值 | X | X | X | 空值 |
db<>在這里擺弄
期望的輸出:
| ID | 當前金額 | 風險評級 | 簡稱 | 例外代碼 |
|---|---|---|---|---|
| 1010 | 100 | 2 | 約翰·克爾斯普 | A B C D |
| 1011 | 200 | 5 | 大衛·斯庫 | A B C D |
| 1022 | 300 | 1 | 帕特里克 | A B C D |
| 1022 | 300 | 1 | 帕特里克 | EFGH |
| 1022 | 300 | 1 | 帕特里克 | IJKL |
uj5u.com熱心網友回復:
你可以嘗試CROSS APPLY使用VALUE
select t1.id,
t1.CurrentAmount,
t1.RiskRating,
t1.ShortName,
v.Expectioncode
from table1 t1 CROSS APPLY (
VALUES (ABCD,'ABCD'),
(EFGH,'EFGH'),
(IJKL,'IJKL'),
(MNOP,'MNOP')
) v (val,Expectioncode)
WHERE v.val IS NOT NULL
編輯
根據您的評論,如果某些資料型別不是varchar您可以嘗試使用CAST相同的型別(從您的示例代碼中,您可能會強制VARCHAR(10)轉換為與其他列相同的型別。)否則您可能會收到轉換錯誤。
select t1.id,
t1.CurrentAmount,
t1.RiskRating,
t1.ShortName,
v.Expectioncode
from table1 t1 CROSS APPLY (
VALUES (ABCD,'ABCD'),
(EFGH,'EFGH'),
(IJKL,'IJKL'),
(CAST(MNOP AS VARCHAR(10)),'MNOP')
) v (val,Expectioncode)
WHERE v.val IS NOT NULL
sqlfiddle
uj5u.com熱心網友回復:
另一種方法是使用 UNPIVOT 函式。一個優點是不必再次定義列名。
SELECT [Id]
,[CurrentAmount]
,[RiskRating]
,[ShortName]
,ExceptionCode
FROM (Select [Id]
,[CurrentAmount]
,[RiskRating]
,[ShortName]
, ABCD, EFGH, IJKL, CAST(MNOP AS VARCHAR(10)) MNOP
FROM [Table1]) p
UNPIVOT
(ExceptionCode_Value FOR ExceptionCode IN
(ABCD, EFGH, IJKL, MNOP)) AS unpvt;
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/457829.html
下一篇:合并具有相同ID的資料
