【问题标题】:SQL using FOR XML PATH to do a group by and concatenationSQL 使用 FOR XML PATH 进行分组和连接
【发布时间】:2020-12-07 01:59:40
【问题描述】:

我正在使用FOR XML PATH 进行组连接,但它没有将颜色分组为最终结果。

select distinct 
    m1.inv_mast_uid,
    m1.short_code,
    m1.class_id1,
    m1.class_id5,
    stuff((select distinct '' + ud.color + ', '
           from inv_mast m2
           join inv_mast_ud as ud on ud.inv_mast_uid = m2.inv_mast_uid
           where m1.inv_mast_uid = m2.inv_mast_uid
           for xml path(''), type).value('.', 'nvarchar(max)'), 1, 0, '') as colors
from 
    inv_mast as m1

表格 inv_mast

inv_mast_uid    short_code  class_id1   class_id5
-------------------------------------------
469             EPHESUS     EPHESUS     10X16
470             EPHESUS     EPHESUS     10X16
471             EPHESUS     EPHESUS     13X13
472             EPHESUS     EPHESUS     13X13
707             EPHESUS     EPHESUS     NULL

表格 inv_mast_ud

inv_mast_uid    color
-------------------------------------------
469             Brown
470             Ivory
471             Brown
472             Ivory
707             Brown

当前结果:

short_code  class_id1   class_id5   colors
-------------------------------------------
EPHESUS     EPHESUS     NULL        Brown, 
EPHESUS     EPHESUS     10X16       Brown, 
EPHESUS     EPHESUS     10X16       Ivory, 
EPHESUS     EPHESUS     13X13       Brown, 
EPHESUS     EPHESUS     13X13       Ivory, 

期望的结果

short_code  class_id1   class_id5   colors
-------------------------------------------------
EPHESUS     EPHESUS     NULL        Brown, Ivory
EPHESUS     EPHESUS     10X16       Brown, Ivory
EPHESUS     EPHESUS     13X13       Brown, Ivory

【问题讨论】:

  • 您使用的是什么版本的 SQL Server?
  • Microsoft SQL Server 2014 (SP3-GDR) (KB4532095) - 12.0.6118.4 (X64) 2019 年 12 月 12 日 21:46:15 版权所有 (c) Microsoft Corporation Enterprise Edition:基于内核的许可 (64 -bit) 在 Windows NT 6.3 (Build 9600: )

标签: sql-server xml tsql


【解决方案1】:

在提出问题时,您需要提供 DDL 和样本数据总体。所以我必须根据自己的想象,即时想出它。

不清楚你的主键是什么。

请尝试以下解决方案。

SQL

-- DDL and sample data population, start
DECLARE @tbl TABLE (short_code VARCHAR(10), class_id1 VARCHAR(10), class_id5 VARCHAR(10), color VARCHAR(10));
INSERT INTO @tbl (short_code, class_id1, class_id5,  color) VALUES
('EPHESUS','EPHESUS', NULL  ,'Brown'),
('EPHESUS','EPHESUS','10X16','Brown'),
('EPHESUS','EPHESUS','10X16','Ivory'),
('EPHESUS','EPHESUS','13X13','Brown'),
('EPHESUS','EPHESUS','13X13','Ivory');
-- DDL and sample data population, end

DECLARE @separator CHAR(2) = ', ';

SELECT short_code, class_id1, class_id5 
   , STUFF((SELECT @separator + CAST(color AS VARCHAR(10)) AS [text()]
         FROM @tbl AS O
         WHERE O.short_code = C.short_code 
         AND COALESCE(O.class_id5, '') = COALESCE(C.class_id5, '')
         FOR XML PATH('')), 1, 1, NULL) AS colorList
FROM @tbl AS c
GROUP BY short_code, class_id1, class_id5; 

输出

+------------+-----------+-----------+-------------+
| short_code | class_id1 | class_id5 |  colorList  |
+------------+-----------+-----------+-------------+
| EPHESUS    | EPHESUS   | NULL      | Brown       |
| EPHESUS    | EPHESUS   | 10X16     | Brown,Ivory |
| EPHESUS    | EPHESUS   | 13X13     | Brown,Ivory |
+------------+-----------+-----------+-------------+

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-04-09
    • 1970-01-01
    • 1970-01-01
    • 2015-07-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多