Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL-将多行转换为多列_Sql_Sql Server - Fatal编程技术网

SQL-将多行转换为多列

SQL-将多行转换为多列,sql,sql-server,Sql,Sql Server,这里需要一个简单的帮助。已经尝试过各种解决方案,如用例和行号、pivot,但无法找到合适的解决方案 基本上,我希望使用组名称值,查找所有非空和不同的值,并在一行中显示结果 输入 Name | Color John | Blue John | Green Mary | NULL Mary | Yellow Mary | Pink Mary | Pink 预期产量 Name | Color1 | Color2 | Color3 John | Blue | Green | NULL Mary

这里需要一个简单的帮助。已经尝试过各种解决方案,如用例和行号、pivot,但无法找到合适的解决方案

基本上,我希望使用组名称值,查找所有非空和不同的值,并在一行中显示结果

输入

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

我认为您应该在这里使用
densite\u RANK
,而不是
ROW\u 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;


目前还不完全清楚您实际希望对颜色使用什么顺序,因为在您预期的输出中,John的颜色在上升,而Mary的颜色在下降。我选择了升序,最后是
NULL
s。

我认为您应该在这里使用
densite\u RANK
,而不是
行数

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;


目前还不完全清楚您实际希望对颜色使用什么顺序,因为在您预期的输出中,John的颜色在上升,而Mary的颜色在下降。我选择了升序,最后是
NULL
s。

您可以得到json格式的结果,如示例中所示:

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

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

您可以获得json格式的结果,如示例中所示:

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

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

谢谢。我现在有点理解这个概念了。问题是因为该表与多个表联接,目前正在研究如何包含join语句STHANKS。我现在有点理解这个概念了。问题是因为该表与多个表联接,目前正在研究如何包含联接语句您使用的是哪种dbms?使用SQL Server您使用的是哪种dbms?使用SQL Server显然OP使用的是SQL Server。这还能用吗?显然OP使用的是SQL Server。这还能用吗?