【问题标题】:How to separate unique values respective to its row using STUFF and FOR XML PATH如何使用 STUFF 和 FOR XML PATH 分隔与其行相关的唯一值
【发布时间】:2020-12-02 06:49:09
【问题描述】:

我正在运行这个查询:

SELECT A.PeripheralNumber, P.LoginName, P.FirstName, P.LastName, A.EnterpriseName, A.AgentDeskSettingsID, AttributeValues = 
STUFF((SELECT ',' + ATT.EnterpriseName+'='+AT.AttributeValue AS Attribute
FROM Agent_Attribute AT
LEFT JOIN Agent A ON A.SkillTargetID = AT.SkillTargetID
LEFT JOIN Attribute ATT ON ATT.AttributeID = AT.AttributeID
WHERE A.SkillTargetID IN ('26379','24111')
ORDER BY Attribute
FOR XML PATH (''), TYPE ).value('.', 'VARCHAR(MAX)'), 1, 1, '')
FROM Agent A
LEFT JOIN Person P ON P.PersonID = A.PersonID
LEFT JOIN Agent_Desk_Settings ADS ON ADS.AgentDeskSettingsID = A.AgentDeskSettingsID
WHERE A.SkillTargetID IN ('26379','24111')
AND A.EnterpriseName LIKE 'PG_8%'
AND P.FirstName NOT LIKE '%Test%'
GROUP BY A.PeripheralNumber, P.LoginName, P.FirstName, P.LastName, A.EnterpriseName, A.AgentDeskSettingsID

我得到的结果如下:

|PeripheralNumber|LoginName|FirstName|LastName|EnterpriseName|AgentDeskSettingsID|AttributeValues                                                                                                 |
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
|551628          |551628   |John     |Doe     |Doe_John      |5104               |AAH_CSC_EXIST=5,AAH_CSC_FNOL=5,AAH_CSC_ROTL=5,AAH_SERVICE_AUTO=10,AAH_SERVICE_REBRAND=5,AAH_SERVICE_WEB_ONLINE=10|
|558792          |558792   |Jane     |Doe     |Doe_Jane      |5103               |AAH_CSC_EXIST=5,AAH_CSC_FNOL=5,AAH_CSC_ROTL=5,AAH_SERVICE_AUTO=10,AAH_SERVICE_REBRAND=5,AAH_SERVICE_WEB_ONLINE=10|
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

目前正在合并 John Doe 和 Jane Doe 的唯一 AttributeValues。我需要的结果如下:

|PeripheralNumber|LoginName|FirstName|LastName|EnterpriseName|AgentDeskSettingsID|AttributeValues                                                                                                 |
------------------------------------------------------------------------------------------------------------------------------------------------------
|551628          |551628   |John     |Doe     |Doe_John      |5104               |AAH_SERVICE_AUTO=10,AAH_SERVICE_REBRAND=5,AAH_SERVICE_WEB_ONLINE=10|
|558792          |558792   |Jane     |Doe     |Doe_Jane      |5103               |AAH_CSC_EXIST=5,AAH_CSC_FNOL=5,AAH_CSC_ROTL=5                      |
------------------------------------------------------------------------------------------------------------------------------------------------------

帮助!这是 MS SQL Server 2016

【问题讨论】:

  • 从不FROM 子句中使用逗号。 始终使用正确、明确、标准、可读的JOIN语法。
  • @GordonLinoff,我已经更新了上面的查询以包含 JOINS...仍然得到相同的结果
  • 。 .尽管可以发现错误的人会回答,但更有可能。

标签: sql sql-server xml sql-server-2016 stuff


【解决方案1】:

cross applyouter apply。像这样的:

SELECT DISTINCT A.PeripheralNumber, P.LoginName, P.FirstName, P.LastName, A.EnterpriseName, A.AgentDeskSettingsID, DS.AttributeValues
FROM Agent A
LEFT JOIN Person P
    ON A.PersonID = P.PersonID
LEFT JOIN Agent_Desk_Settings ADS
    ON A.AgentDeskSettingsID = ADS.AgentDeskSettingsID
OUTER APPLY
(
    SELECT STUFF((SELECT ',' + ATT.EnterpriseName+'='+AT.AttributeValue AS Attribute
    FROM Agent_Attribute AT
    INNER JOIN Attribute ATT
        ON ATT.AttributeID = AT.AttributeID
    WHERE A.SkillTargetID = AT.SkillTargetID
    ORDER BY Attribute
    FOR XML PATH (''), TYPE ).value('.', 'VARCHAR(MAX)'), 1, 1, '')
) DS (AttributeValues)
WHERE A.SkillTargetID IN ('26379','24111')
    AND A.EnterpriseName LIKE 'PG_8%'
    AND P.FirstName NOT LIKE '%Test%'

【讨论】:

    【解决方案2】:

    如果要将值限制为单个人,则需要关联该人:

    STUFF((SELECT ',' + ATT.EnterpriseName+'='+AT.AttributeValue AS Attribute
           FROM Agent_Attribute AT JOIN
                Agent A 
                ON A.SkillTargetID = AT.SkillTargetID
                Attribute ATT
                ON ATT.AttributeID = AT.AttributeID
                WHERE A.SkillTargetID IN (26379, 24111) AND
                      AA.PersonID = p.PersonId
                ORDER BY Attribute
                FOR XML PATH (''), TYPE
               ).value('.', 'VARCHAR(MAX)'), 1, 1, '')
    

    请注意,我删除了看起来像数字常量的单引号。如果这些确实是字符串,则包括单引号。

    另外,LEFT JOINs 在相关子查询中是多余的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-09-21
      • 2021-05-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-16
      • 1970-01-01
      • 2021-09-02
      相关资源
      最近更新 更多