SQL PIVOT - 多个动态列

SQL PIVOT - Multiple Dynamic Columns

问题

如果有多个,需要将文件提交给希望为数据使用列的提供者。

我们的 SQL 数据库记录 'claims' 就像下面我创建的例子一样的行:

PolRef@     Number  Type                Date                        Value
ABHX06HQ01  1       Escape Of Water     2009-05-01 00:00:00.000     840
ABHX06HQ01  2       Escape Of Water     2009-05-06 00:00:00.000     400
ABHX06HQ01  3       Escape Of Water     2010-02-01 00:00:00.000     304
ABHX06HQ01  4       Storm Damage        2010-02-11 00:00:00.000     59
ABHX06HQ01  5       Accidental Damage   2011-10-14 00:00:00.000     497
ABHX06HQ01  6       Falling Trees       2011-09-29 00:00:00.000     1172

我需要提交的文件要求这些索赔行中的每一行都是列,因此 SQL 中的列基本上是:

ClaimNumber1,   ClaimType1,         ClaimDate1,                 ClaimValue1,    ClaimNumber2,   ClaimType2,         ClaimDate2,                 ClaimValue2,    ClaimNumber3,   ClaimType3,         ClaimDate3,                 ClaimValue3
1               Escape Of Water     2009-05-01 00:00:00.000     840             2               Escape Of Water     2009-05-06 00:00:00.000     400             3               Escape Of Water     2010-02-01 00:00:00.000     304

这很可能最多为 10,但动态列会更好。我有一种感觉,这将是一个 PIVOT,尽管我什至不知道从哪里开始。

我开始为每个 WHERE Number = X 做一个 UNION,但它看起来非常陈旧,但最终会得到我的结果。

虽然您可以使用 PIVOT 运算符,但我更喜欢条件聚合。

此技术使用一个或多个 case expressions 将行拆分为列。 group by 子句与聚合函数相结合,然后减少最终的行数。

这是一个使用 table.

的前三行的示例
-- Rows to columns
SELECT
    PolRef,
    CASE WHEN Number = 1 THEN [TYPE_ID] ELSE '' END AS Type_1,
    CASE WHEN Number = 2 THEN [TYPE_ID] ELSE '' END AS Type_2,
    CASE WHEN Number = 3 THEN [TYPE_ID] ELSE '' END AS Type_3
FROM
    YourTable
GROUP BY
    PolRef
;

Returns

Polref  x  Type_1           Type_2           Type_3
ABHX06HQ01 Escape Of Water
ABHX06HQ01                  Escape Of Water
ABHX06HQ01                                   Escape Of Water

并添加一个分组 aggregation function 像这样:

-- Remove additional rows.
SELECT
    PolRef,
    MAX(CASE WHEN Number = 1 THEN [TYPE_ID] ELSE '' END) AS Type_1,
    MAX(CASE WHEN Number = 2 THEN [TYPE_ID] ELSE '' END) AS Type_2,
    MAX(CASE WHEN Number = 3 THEN [TYPE_ID] ELSE '' END) AS Type_3
FROM
    YourTable
GROUP BY
    PolRef
;

将返回的行数从三减少到一。

Polref  x  Type_1           Type_2           Type_3
ABHX06HQ01 Escape Of Water  Escape Of Water  Escape Of Water