【问题标题】:MSSQL - GROUP_CONCATMSSQL - GROUP_CONCAT
【发布时间】:2018-09-21 20:48:50
【问题描述】:

这里是示例数据:

IdProduit   Localisation    Qte_EnMain
4266864286880063006 E2-R40-B-T  13.00000
4266864286880063006 E2-R45-B-T  81.00000
4266864286880063007 E2-R45-C-T  17.00000
4266864286880063008 E2-R37-B-T  8.00000

这就是我想要的

IdProduit           AllLocalisation
4266864286880063006 E2-R40-B-T (13), E2-R45-B-T (81)
4266864286880063007 E2-R45-C-T (17)
4266864286880063008 E2-R37-B-T (8)

我在论坛上看了所有关于 GROUP_CONCAT 的例子,并尝试了几个测试。

我不太懂 STUFF()。

这是我想做的:

SELECT
  a.IdProduit,
  GROUP_CONCAT(
      CONCAT(b.Localisation, ' (', CAST(ROUND(a.Qte_EnMain, 0) AS NUMERIC(36, 0)), ')')
  ) AS AllLocation
FROM
  ogasys.INV_InventENTLoc a
  LEFT JOIN ogasys.INV_LocName b ON a.IdLoc = b.IdLoc
GROUP BY a.IdProduit, b.Localisation, a.Qte_EnMain

现在因为 GROUP_CONCAT 不使用 MSSQL,这是我在这个论坛上的所有示例中创建的查询。

SELECT
  DISTINCT
  a1.IdProduit,
  STUFF((SELECT DISTINCT '' + b2.Localisation
         FROM
           ogasys.INV_InventENTLoc a2
           LEFT JOIN ogasys.INV_LocName b2 ON a2.IdLoc = b2.IdLoc
         WHERE a2.IdLoc = a1.IdLoc
         FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)'), 1, 0, '') data
FROM
  ogasys.INV_InventENTLoc a1
  LEFT JOIN ogasys.INV_LocName b1 ON a1.IdLoc = b1.IdLoc
ORDER BY a1.IdProduit

该查询仅按行返回一个本地化我不明白如何使此查询正常工作。

编辑:

这是我的情况的解决方案:

SELECT
  a.IdProduit,
  STUFF(
      (SELECT ', ' + b2.Localisation + ' (' + CAST(CAST(ROUND(a2.Qte_EnMain, 0) AS NUMERIC(36, 0)) AS VARCHAR(32)) + ')'
       FROM ogasys.INV_InventENTLoc a2
         LEFT JOIN ogasys.INV_LocName b2 ON a2.IdLoc = b2.IdLoc
       WHERE a.IdProduit = a2.IdProduit
       FOR XML PATH (''))
      , 1, 1, '') AS AllLocalisation
FROM
  ogasys.INV_InventENTLoc a
  LEFT JOIN ogasys.INV_LocName b ON a.IdLoc = b.IdLoc
GROUP BY a.IdProduit

【问题讨论】:

  • 样本数据和预期结果是什么?你是什​​么意思它不工作。您没有收到看起来没有的错误,因此此处需要示例数据和预期结果。
  • SQL Server 支持STRING_AGG,相当于GROUP_CONCAT
  • @Dai 在 SQL Server 2017 上,我敢肯定你知道,但仅适用于其他所有人。

标签: sql sql-server string-aggregation


【解决方案1】:

使用STUFF

declare @table table (IdProduit varchar(100), Localisation varchar(50),  Qte_EnMain float)

insert into @table
values 
('4266864286880063006','E2-R40-B-T',  13.00000),
('4266864286880063006','E2-R45-B-T',  81.00000),
('4266864286880063007','E2-R45-C-T',  17.00000),
('4266864286880063008','E2-R37-B-T',  8.00000)


select IdProduit,
  STUFF (
        (SELECT   
                ',' + localisation + concat(' (',cast(qte_enMain as varchar(4)),') ')
        FROM @table t2
        where t2.IdProduit = t1.IdProduit
        FOR XML PATH('')), 1, 1, ''
    )
 from @table t1
group by
IdProduit

【讨论】:

    猜你喜欢
    • 2020-11-14
    • 2021-07-27
    • 1970-01-01
    • 1970-01-01
    • 2011-01-31
    • 1970-01-01
    • 2013-03-28
    • 2019-05-31
    相关资源
    最近更新 更多