【问题标题】:Multiple rows into single column多行成单列
【发布时间】:2019-08-09 23:56:47
【问题描述】:

我在表格中有以下数据。

需要如下输出。

我尝试了以下逻辑,但在我的情况下,那些 Item# 列是 NVARCHAR 类型,因此 MAX 聚合函数给出了未知的结果。

SELECT ID, Item1, Item2, Item3, Item4, Item5
FROM(
SELECT ID, MAX(Item1), MAX(Item2), MAX(Item3), MAX(Item4), MAX(Item5)
FROM Sample_Table WITH(NOLOCK)
) A
WHERE A.ID = '0001_11'
GROUP BY A.ID

请帮助我得到这个结果。 提前致谢。

【问题讨论】:

  • 请发布数据而不是图片
  • 我认为您的意思是text 而不是“数据”@Chanukya。这些图像是“数据”。 :)
  • 真的在你的列中有字符串'unknown',看起来像int吗?如果是这样,'unknown' 的值比'7622' 的“更大”;这可以解释为什么你没有得到你想要的结果。
  • @Larnu,是的,我们有一个字符串“未知”,它是 nvarchar 类型,而不是 int。

标签: sql sql-server sql-server-2008 sql-server-2012 sql-server-2014


【解决方案1】:

尝试使用透视逻辑。在这种情况下,我们要忽略值Unknown,因此下面的CASE 表达式将其分配给NULL,而SUM 将忽略它。

SELECT
    ID,
    MAX(CASE WHEN Item1 = 'Unknown' THEN NULL ELSE Item1 END) AS Item1,
    MAX(CASE WHEN Item2 = 'Unknown' THEN NULL ELSE Item2 END) AS Item2,
    MAX(CASE WHEN Item3 = 'Unknown' THEN NULL ELSE Item3 END) AS Item3,
    MAX(CASE WHEN Item4 = 'Unknown' THEN NULL ELSE Item4 END) AS Item4,
    MAX(CASE WHEN Item5 = 'Unknown' THEN NULL ELSE Item5 END) AS Item5,
    MAX(CASE WHEN Item6 = 'Unknown' THEN NULL ELSE Item6 END) AS Item6
FROM yourTable
GROUP BY
    ID;

【讨论】:

  • 谢谢蒂姆·比格莱森。按预期工作。
【解决方案2】:

使用 TRY_CAST 将值转换为数字。如果值无法转换,TRY_CAST 返回 NULL。

SELECT ID,
    MAX(TRY_CAST(Item1 as INT)) AS Item1,
    MAX(TRY_CAST(Item2 as INT)) AS Item2,
    MAX(TRY_CAST(Item3 as INT)) AS Item3,
    MAX(TRY_CAST(Item4 as INT)) AS Item4,
    MAX(TRY_CAST(Item5 as INT)) AS Item5,
    MAX(TRY_CAST(Item6 as INT)) AS Item6
FROM Sample_Table WITH(NOLOCK)
GROUP BY ID;

【讨论】:

    猜你喜欢
    • 2018-04-04
    • 2023-03-09
    • 1970-01-01
    • 1970-01-01
    • 2022-10-05
    • 1970-01-01
    • 2020-06-28
    • 2013-12-31
    • 1970-01-01
    相关资源
    最近更新 更多