在 SQL 中动态选择要从行本身中选择的列

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

提前致谢。

Mat*_*lie 6

你只需要一个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