我有一個 SQL Server 表,其中包含一些資料,如下所示。P列的數量是固定的,但是列會太多。將有多個列,如 S1、S2 等
| ID | 已選P | P1 | P2 | P3 | P4 | P5 |
|---|---|---|---|---|---|---|
| 1 | P2 | 3 | 8 | 4 | 15 | 7 |
| 2 | P1 | 0 | 2 | 6 | 0 | 3 |
| 3 | P3 | 1 | 15 | 2 | 1 | 11 |
| 4 | P4 | 3 | 4 | 6 | 2 | 4 |
我需要撰寫一個可以得到以下結果的 SQL 陳述句。基本上,需要從每一行中選擇哪一列取決于該行本身的 SelectedP 值。SelectedP 包含要為每一行選擇的列。
| ID | 已選P | 選定的 P 值 |
|---|---|---|
| 1 | P2 | 8 |
| 2 | P1 | 0 |
| 3 | P3 | 2 |
| 4 | P4 | 2 |
提前致謝。
uj5u.com熱心網友回復:
你只需要一個CASE表情...
SELECT
id,
SelectedP,
CASE SelectedP
WHEN 'P1' THEN P1
WHEN 'P2' THEN P2
WHEN 'P3' THEN P3
WHEN 'P4' THEN P4
WHEN 'P5' THEN P5
END
AS SelectedPValue
FROM
yourTable
這將回傳運算式NULL中未提及的任何內容。CASE
編輯:
打字少一點的選項...
SELECT
id, SelectedP, val
FROM
yourTable AS pvt
UNPIVOT
(
val FOR P IN
(
P1,
P2,
P3,
P4,
P5
)
)
AS unpvt
WHERE
SelectedP = P
注意:如果 的值SelectedP不存在于 中UNPIVOT,則該行根本不會出現(與CASE回傳 a 的運算式不同NULL)
演示:https ://dbfiddle.uk/?rdbms=sqlserver_2019&fiddle=b693738aac0b594cf37410ee5cb15cf5
編輯2:
我不知道這是否會比第二個選項更糟糕,但這保留了NULL行為。
(首選選項仍然是修復您的資料結構。)
SELECT
id, SelectedP, MAX(CASE WHEN SelectedP = P THEN val END) AS val
FROM
yourTable AS pvt
UNPIVOT
(
val FOR P IN
(
P1,
P2,
P3,
P4,
P5
)
)
AS unpvt
GROUP BY
id, SelectedP
演示:https ://dbfiddle.uk/?rdbms=sqlserver_2019&fiddle=f3f64d2fb6e11fd24d1addbe1e50f020
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/430085.html
上一篇:SQLServer中的非嵌套陣列
下一篇:SQL:從路徑中提取字串
