将具有相同 ID 的不同行的数据移动到相同行但不同列的数据 sql
Move the data from different rows with same ID in same rows but different column in sql
我有这样的数据
ID ded1 ded2 ded3 ded4
------------------------------
1 2
1 3
1 4
我要:
ID ded1 ded2 ded3 ded4
------------------------------
1 2 3 4
ded4
为空白,因为有 3 个值,如果第 4 个值存在,则 ded4
填满
当且仅当您的列数有限并且您觉得不需要将值分配给动态命名的列的函数时,那么您可以按以下方式执行此操作:
使用像 row_number()
这样的分析函数来确定顺序 - 哪个值应该放在哪一列下,然后将结果按 id
分组并取 max()
值作为一行在你的 CASE
陈述中。
SELECT
id,
MAX(CASE WHEN ded_rn = 1 THEN ded1 END) AS ded1,
MAX(CASE WHEN ded_rn = 2 THEN ded1 END) AS ded2,
MAX(CASE WHEN ded_rn = 3 THEN ded1 END) AS ded3,
MAX(CASE WHEN ded_rn = 4 THEN ded1 END) AS ded4
FROM(
SELECT
*,
row_number() OVER (PARTITION BY id ORDER BY ded1) AS ded_rn
FROM
tbl
) foo
GROUP BY id
这是一个 SQL fiddle 展示带有示例数据的讨论案例。
虽然@ConsiderMe 的回答非常正确,但如果您对分组依据有问题,或者您希望从源 table 中包含其他列,您也可以进行 4 次连接。有时这是唯一可行的解决方案。 (顺便说一句,它与这段代码基本相同)。
此代码比@CondiderMe 的答案稍慢,因为它需要 3 个 scans/seeks 而他的只有 2 个。所以只在需要时使用它。
With addRN AS
(
SELECT *,
row_number() OVER (PARTITION BY id ORDER BY ded1) AS rn
FROM tbl
)
SELECT ids.id, r1.ded1 as ded1, r2.ded1 as ded2, r3.ded1 ad ded3, r4.ded1 as ded4
FROM (SELECT DISTINCT id FROM tbl) ids
LEFT JOIN addRN r1 ON ids.id = r1.id AND rn = 1
LEFT JOIN addRN r2 ON ids.id = r2.id AND rn = 2
LEFT JOIN addRN r3 ON ids.id = r3.id AND rn = 3
LEFT JOIN addRN r3 ON ids.id = r3.id AND rn = 4
我有这样的数据
ID ded1 ded2 ded3 ded4
------------------------------
1 2
1 3
1 4
我要:
ID ded1 ded2 ded3 ded4
------------------------------
1 2 3 4
ded4
为空白,因为有 3 个值,如果第 4 个值存在,则 ded4
填满
当且仅当您的列数有限并且您觉得不需要将值分配给动态命名的列的函数时,那么您可以按以下方式执行此操作:
使用像 row_number()
这样的分析函数来确定顺序 - 哪个值应该放在哪一列下,然后将结果按 id
分组并取 max()
值作为一行在你的 CASE
陈述中。
SELECT
id,
MAX(CASE WHEN ded_rn = 1 THEN ded1 END) AS ded1,
MAX(CASE WHEN ded_rn = 2 THEN ded1 END) AS ded2,
MAX(CASE WHEN ded_rn = 3 THEN ded1 END) AS ded3,
MAX(CASE WHEN ded_rn = 4 THEN ded1 END) AS ded4
FROM(
SELECT
*,
row_number() OVER (PARTITION BY id ORDER BY ded1) AS ded_rn
FROM
tbl
) foo
GROUP BY id
这是一个 SQL fiddle 展示带有示例数据的讨论案例。
虽然@ConsiderMe 的回答非常正确,但如果您对分组依据有问题,或者您希望从源 table 中包含其他列,您也可以进行 4 次连接。有时这是唯一可行的解决方案。 (顺便说一句,它与这段代码基本相同)。
此代码比@CondiderMe 的答案稍慢,因为它需要 3 个 scans/seeks 而他的只有 2 个。所以只在需要时使用它。
With addRN AS
(
SELECT *,
row_number() OVER (PARTITION BY id ORDER BY ded1) AS rn
FROM tbl
)
SELECT ids.id, r1.ded1 as ded1, r2.ded1 as ded2, r3.ded1 ad ded3, r4.ded1 as ded4
FROM (SELECT DISTINCT id FROM tbl) ids
LEFT JOIN addRN r1 ON ids.id = r1.id AND rn = 1
LEFT JOIN addRN r2 ON ids.id = r2.id AND rn = 2
LEFT JOIN addRN r3 ON ids.id = r3.id AND rn = 3
LEFT JOIN addRN r3 ON ids.id = r3.id AND rn = 4