问题
如果存在倍数,则需要向希望使用数据列的提供商提交文件。
我们的SQL DB将“声明”记录为如下所示的行:
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,但它似乎非常古老但最终会得到我的结果。
答案 0 :(得分:1)
虽然您可以使用PIVOT运算符,但我更喜欢条件聚合。
此技术使用一个或多个case expressions将行拆分为列。 group by子句与聚合函数相结合,然后减少最终的行数。
以下是使用表格中前三行的示例。
-- 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
;
返回
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