SQL 仅转置 select 行

SQL Pivot only select rows

我正在尝试旋转数据库,以便只有某些行成为列。下面是我的 table 的样子:

ID  QType       CharV       NumV
1   AccNum                  10
1   EmpNam      John Inc    0
1   UW          Josh        0
2   AccNum                  11
2   EmpNam      CBS         0
2   UW          Dan         0

我希望 table 看起来像这样:

ID  AccNum      EmpNam
1   10          John Inc
2   11          CBS 

我有两个主要问题要解决。

1st:我试图获得的值并不总是在同一列中。因此,虽然 AccNum 始终位于 NumV 列中,但 EmpName 始终位于 CharV 列中。

第二:我需要找到一种方法来忽略不需要的数据。在此示例中,它将是 QType 列中带有 UW 的行。

下面是我的代码:

SELECT *
  FROM testTable
    Pivot(
    MAX(NumV)
    FOR[QType]
    In ([AccNum],[TheValue])
    )p

但它给了我以下结果:

ID  CharV   AccNum  TheValue
1           10      NULL
2           11      NULL
2   CBS     NULL    NULL
2   Dan     NULL    NULL
1   John IncNULL    NULL
1   Josh    NULL    NULL

在这种情况下,使用条件聚合进行分组应该可行。尝试类似的东西:

SELECT ID
, MAX(CASE WHEN QType = 'AccNum' THEN NumV END) AS AccNum
, MAX(CASE WHEN QType = 'EmpNam' THEN CharV END) AS EmpNam
FROM testTable
GROUP BY ID

由于内部 CASE 仅在满足 WHEN 条件时获取值,因此 MAX 函数将为您提供所需的值。当然,这只有在每个 ID 只有唯一的 QType 时才有效。

当您的条件很复杂时,通常在 Sql-Server 中使用 PIVOT 无法一步完成,特别是当您需要来自不同列的值时。您可以在两个查询中旋转 table 并加入它们,但它的性能会很差,而且可读性不如我的建议。