【问题标题】:Using GROUP BY with FOR XML PATH in SQL Server 2016在 SQL Server 2016 中使用 GROUP BY 和 FOR XML PATH
【发布时间】:2021-08-22 09:28:47
【问题描述】:

我正在尝试

  1. 按 ID 和分组
  2. 将多个 cmets 聚合到一行中

现在,我可以做到。单个 ID (ID = 1006) 的 2 部分,但我想汇总所有 ID 的 cmets。我正在努力在查询中添加“group by”子句的位置和方式。

这里是查询:

create table Comments (ID int, Comment nvarchar(150), RegionCode int)


insert into Comments values (1006, 'I', 1)
, (1006, 'am', 1)
, (1006, 'good', 1)
, (1006, 'bad', 2)
, (2, 'You', 1)
, (2, 'are', 1)
, (2, 'awesome', 1)


SELECT 
    SUBSTRING((SELECT Comment
               FROM Comments
               WHERE ID = 1006 AND RegionCode != 2
               FOR XML PATH('')), 1, 999999) AS Comment_Agg

我想要的结果如下所示:

仅供参考,我在这里使用 FOR XML PATH 将多个 cmets 聚合到一行中,因为我的版本 - SQL Server 2016 (v13.x) 不支持 STRING_AGG 函数。

【问题讨论】:

  • 这能回答你的问题吗? group by and FOR XML PATH
  • 你基本不能进行正常的聚合,需要在子查询中重新查询表(虽然可以关联)所以比如SELECT c.Comment FROM Comments c2 WHERE c2.ID = c.ID FOR XML PATH。如果您发布完整的查询,我们可以试一试
  • 提问时,您需要提供minimal reproducible example: (1) DDL 和样本数据填充,即 CREATE 表加上 INSERT T-SQL 语句。 (2) 你需要做什么,即逻辑和你的代码尝试在 T-SQL 中实现它。 (3) 期望的输出,基于上面#1 中的样本数据。 (4) 您的 SQL Server 版本 (SELECT @@version;)。全部在问题内,没有图片。
  • @Charlieface 我刚刚使用可重现的示例编辑了查询。感谢您的帮助:)
  • @YitzhakKhabinsky 我刚刚使用可重现的示例编辑了查询。感谢您的帮助:)

标签: sql-server for-xml-path


【解决方案1】:

请尝试以下解决方案。

SQL

-- DDL and sample data population, start
DECLARE @tbl TABLE (ID int, Comment nvarchar(150));
INSERT INTO @tbl VALUES 
(1006, 'I'),
(1006, 'am'),
(1006, 'good'),
(2, 'You'),
(2, 'are'),
(2, 'awesome');
-- DDL and sample data population, end

DECLARE @separator CHAR(1) = SPACE(1);

SELECT p.ID
   , STUFF((SELECT @separator + Comment 
          FROM @tbl AS c
          WHERE c.ID = p.ID
          FOR XML PATH('')), 1, LEN(@separator), '') AS Result
FROM @tbl AS p
GROUP BY p.ID
ORDER BY p.ID;

输出

+------+-----------------+
|  ID  |     Result      |
+------+-----------------+
|    2 | You are awesome |
| 1006 | I am good       |
+------+-----------------+

【讨论】:

    猜你喜欢
    • 2017-09-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-21
    • 1970-01-01
    相关资源
    最近更新 更多