从 SQL 中的行本身动态地 select 中的列到 select
Dynamically selecting the column to select from the row itself in SQL
我有一个 SQL 服务器 table 有一些数据如下。 P 列的数量是固定的,但列数会太多。时尚会有多个栏目,如S1,S2等
Id
SelectedP
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语句来得到下面的结果。基本上,需要从每一行中 selected 哪一列取决于该行本身的 SelectedP 值。 SelectedP 包含每行 select 的列。
Id
SelectedP
Selected-P-Value
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
对于 CASE
表达式中未提及的任何内容,这将 return NULL
。
编辑:
一个选项,只需 一点 少输入...
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
中不存在,那么row 根本不会出现 (不像 CASE
表达式 return a NULL
)
演示:https://dbfiddle.uk/?rdbms=sqlserver_2019&fiddle=b693738aac0b594cf37410ee5cb15cf5
编辑 2:
我不知道这是否会比第二个选项执行得更差,但这保留了 NULL
行为。
(首选还是修复你的data-structure。)
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
我有一个 SQL 服务器 table 有一些数据如下。 P 列的数量是固定的,但列数会太多。时尚会有多个栏目,如S1,S2等
Id | SelectedP | 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语句来得到下面的结果。基本上,需要从每一行中 selected 哪一列取决于该行本身的 SelectedP 值。 SelectedP 包含每行 select 的列。
Id | SelectedP | Selected-P-Value |
---|---|---|
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
对于 CASE
表达式中未提及的任何内容,这将 return NULL
。
编辑:
一个选项,只需 一点 少输入...
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
中不存在,那么row 根本不会出现 (不像 CASE
表达式 return a NULL
)
演示:https://dbfiddle.uk/?rdbms=sqlserver_2019&fiddle=b693738aac0b594cf37410ee5cb15cf5
编辑 2:
我不知道这是否会比第二个选项执行得更差,但这保留了 NULL
行为。
(首选还是修复你的data-structure。)
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