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
问题
如果有多个,需要将文件提交给希望为数据使用列的提供者。
我们的 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