【问题标题】:SQL - Converting multiple rows into multiple columnsSQL - 将多行转换为多列
【发布时间】:2018-10-30 02:58:42
【问题描述】:

在这里需要一个简单的帮助。尝试了各种解决方案,例如使用案例和行号,枢轴但无法找到合适的解决方案。

基本上我想使用组名称值并找到所有非空值和不同值并将结果显示在一行中。

输入

Name | Color
John | Blue
John | Green
Mary | NULL
Mary | Yellow
Mary | Pink
Mary | Pink

预期输出

Name | Color1 | Color2 | Color3
John | Blue   | Green  |  NULL
Mary | Yellow | Pink   |  NULL

目前我已经提出了以下查询,但看起来与我想要的结果相去甚远。感谢您的帮助,谢谢!

select  Name,
    max(case when seqnum = 1 then Color end) as Color1,
    max(case when seqnum = 2 then Color end) as Color2,
    max(case when seqnum = 3 then Color end) as Color3
from (select table.*, row_number() over (partition by Name order by Name) as seqnum
    from table
    ) table
group by Name

【问题讨论】:

  • 您使用的是哪个 dbms?
  • 使用 SQL 服务器

标签: sql sql-server


【解决方案1】:

我认为你应该在这里使用DENSE_RANK,而不是ROW_NUMBER

SELECT
    Name,
    MAX(CASE WHEN rnk = 1 THEN Color END) AS Color1,
    MAX(CASE WHEN rnk = 2 THEN Color END) AS Color2,
    MAX(CASE WHEN rnk = 3 THEN Color END) AS Color3
FROM
(
    SELECT *, DENSE_RANK() OVER (PARTITION BY Name
        ORDER BY CASE WHEN Color IS NOT NULL THEN 0 ELSE 1 END, Color) rnk
    FROM yourTable
) t
GROUP BY
    Name;

Demo

尚不完全清楚您实际上想要对颜色使用什么顺序,因为在您的预期输出中,John 的颜色是升序的,而 Mary 的颜色是降序的。我选择升序排列,NULLs 最后。

【讨论】:

  • 谢谢。我现在有点理解这个概念了。问题是因为该表与多个表连接,目前正在弄清楚如何包含连接语句
【解决方案2】:

您可以像示例中那样以 json 格式获得结果:

SELECT concat(
    '{',
    name,
    ':[',
    GROUP_CONCAT(color),
    ']}'
) FROM `test` GROUP BY name

结果:

{
  John: [Blue, Green]
}
{
  Mary: [NULL, Yellow, Pink, Pink]
}

Demo

【讨论】:

  • 显然 OP 正在使用 SQL Server。这还能用吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-27
相关资源
最近更新 更多