Kir*_*n B 1 sql sql-server dynamic-sql
我有一个 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 |
提前致谢。
你只需要一个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
Run Code Online (Sandbox Code Playgroud)
这将返回表达式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
Run Code Online (Sandbox Code Playgroud)
注意:如果 的值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
Run Code Online (Sandbox Code Playgroud)
演示:https ://dbfiddle.uk/?rdbms=sqlserver_2019&fiddle=f3f64d2fb6e11fd24d1addbe1e50f020