在sql中,从同一行中具有相同ID但不同列的不同行中移动数据

在sql中,从同一行中具有相同ID但不同列的不同行中移动数据,sql,sql-server,rownum,Sql,Sql Server,Rownum,我有一个类似于 ID ded1 ded2 ded3 ded4 ------------------------------ 1 2 1 3 1 4 我想: ID ded1 ded2 ded3 ded4 ------------------------------ 1 2 3 4 ded4为空,因为有3个值,如果有第4个值,则ded4将填充如果且仅当您的列数有限,并且您感觉不需要将值分配给动态命

我有一个类似于

  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\u number()
这样的分析函数来确定顺序-哪个值应该放在哪个列下,然后按
id
对结果进行分组,并取
max()
值,从
案例
语句中生成一行

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

下面是一个示例数据演示讨论案例。

如果且仅当您的列数有限,并且您觉得不需要将值分配给动态命名的列的函数,则可以通过以下方式执行此操作:

使用像
row\u number()
这样的分析函数来确定顺序-哪个值应该放在哪个列下,然后按
id
对结果进行分组,并取
max()
值,从
案例
语句中生成一行

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

下面是一个示例数据演示讨论案例。

如果且仅当您的列数有限,并且您觉得不需要将值分配给动态命名的列的函数,则可以通过以下方式执行此操作:

使用像
row\u number()
这样的分析函数来确定顺序-哪个值应该放在哪个列下,然后按
id
对结果进行分组,并取
max()
值,从
案例
语句中生成一行

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

下面是一个示例数据演示讨论案例。

如果且仅当您的列数有限,并且您觉得不需要将值分配给动态命名的列的函数,则可以通过以下方式执行此操作:

使用像
row\u number()
这样的分析函数来确定顺序-哪个值应该放在哪个列下,然后按
id
对结果进行分组,并取
max()
值,从
案例
语句中生成一行

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

下面是一个示例数据演示讨论案例。

虽然@ConsiderMe answer非常正确,但如果您与group by有问题,或者希望从源表中包含其他列,您也可以执行4次联接。这有时是唯一可行的解决办法。(顺便说一句,它与此代码基本相同)

此代码比@CondiderMe的答案稍慢,因为它需要3次扫描/搜索,而his只需要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

虽然@ConsiderMe answer非常正确,但是如果您对group by有问题,或者您希望从源表中包含其他列,那么您也可以执行4次联接。这有时是唯一可行的解决办法。(顺便说一句,它与此代码基本相同)

此代码比@CondiderMe的答案稍慢,因为它需要3次扫描/搜索,而his只需要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

虽然@ConsiderMe answer非常正确,但是如果您对group by有问题,或者您希望从源表中包含其他列,那么您也可以执行4次联接。这有时是唯一可行的解决办法。(顺便说一句,它与此代码基本相同)

此代码比@CondiderMe的答案稍慢,因为它需要3次扫描/搜索,而his只需要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

虽然@ConsiderMe answer非常正确,但是如果您对group by有问题,或者您希望从源表中包含其他列,那么您也可以执行4次联接。这有时是唯一可行的解决办法。(顺便说一句,它与此代码基本相同)

此代码比@CondiderMe的答案稍慢,因为它需要3次扫描/搜索,而his只需要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


在我们回答之前:如果你有,比如说,30行,会发生什么?那么,您想看什么?您使用的是什么平台?数据从ded1到ded30,但我的SQL表中只有ded6作为限制,因此我们需要考虑最多6行。这里有一个提示,您可以给每行一个数字,如下所示
row_number()(按ID分区)正如select语句中的rn
一样。SSMS-SQL server管理研究在回答之前:如果有30行,会发生什么?那么,您想看什么?您使用的是什么平台?数据从ded1到ded30,但我的SQL表中只有ded6作为限制,因此我们需要考虑最多6行。这里有一个提示,您可以给每行一个数字,如下所示
row_number()(按ID分区)正如select语句中的rn
一样。SSMS-SQL server管理研究在回答之前:如果有30行,会发生什么?那么,您想看什么?您使用的是什么平台?数据从ded1到ded30,但我的SQL表中只有ded6作为限制,因此我们需要考虑最多6行。这里有一个提示,您可以给每行一个数字,如下所示
row_number()(按ID分区)正如select语句中的rn
一样。SSMS-SQL server管理研究在回答之前:如果有30行,会发生什么?那么,您想看什么?您使用的是什么平台?数据从ded1到ded30,但我的SQL表只有ded6作为限制,因此我们需要考虑最多6行。这里有一个提示,您可以在select语句中为每行指定一个数字,如以下所示
row_number()(按ID划分)作为rn
。SSMS-SQL server management studio