【问题标题】:How to convert STRING_AGG to stuff function to work query on SQL Server 2017 above?如何将 STRING_AGG 转换为填充函数以在上面的 SQL Server 2017 上进行查询?
【发布时间】:2023-01-02 16:37:58
【问题描述】:

我有以下 SQL 查询,它不适用于 SQL Server 2017 及更高版本

SELECT
    (
        SELECT STRING_AGG(d.Name, ',') AS divnames 
        FROM (
            SELECT div.name, MHLId 
            FROM MsrtProfile mp 
            INNER JOIN Division div ON mp.DivisionId = div.Id 
            WHERE mp.mhlid = ph.potentialHospitalNo  
            GROUP BY div.Name, MHLId
        ) d
    ) AS divisionnames
FROM xyz ph

例如我的输出将如下所示

div1,div2,div3

我需要单列行的逗号值。

我在下面有两个表 - 第一个表名是Hospital

hospitalId   name
-----------------
1            a1
2            a2

第二个表名是division

id  DivisionName    hospitalId
------------------------------
1     d1             1
2     d2             1
3     d3             2

我需要像下面这样的输出,通过 hospitalid 连接第一张和第二张表

DivisionName
-------------
d1,d2
d3

【问题讨论】:

  • 请用示例数据、所需结果以及 SQL Server 2016 及更高版本说明您的问题? STRING_AGG 受 2016 年以上的 2017 年支持?在不到 2017 年的时间里,有大量关于如何使用 FOR XML PATH 执行此操作的示例。
  • 我已经更新了更多的澄清问题。 @戴尔克
  • 您可以制作一个 string_agg dll,然后为此制作自定义函数。按照这个:stackoverflow.com/a/48804363/6467840

标签: sql sql-server sql-server-2017


【解决方案1】:

STRING_AGGGROUP BY 似乎是一个非常直接的查询:

SELECT 
    h.HospitalId, h.Name,
    STRING_AGG(d.DivisionName, ',') AS DivisonName
FROM 
    dbo.Division d
INNER JOIN
    dbo.Hospital h ON h.HospitalId = d.HospitalId
GROUP BY
    h.HospitalId, h.Name

【讨论】:

    【解决方案2】:

    不是将整个查询放在 STRING_AGG 中,而是您似乎想要每个医院的结果,因此从医院查询,使用 Division 上的相关子查询为您的 STRING_AGG 例如

    SELECT
        (
            SELECT STRING_AGG(d.[Name], ',') 
            FROM Division d 
            WHERE d.HospitalId = h.HospitalId
        ) AS DivisionNames
    FROM Hospital h
    

    【讨论】:

      猜你喜欢
      • 2018-07-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-04
      • 2022-08-18
      • 2018-08-27
      相关资源
      最近更新 更多