sql - 使用不同的东西/for xml 路径 ('' )

标签 sql sql-server-2008

我只想将连接字符串中的唯一值放在一起。我的代码目前是:

select rc.Routage
    , COUNT(distinct rc.Event)
    , STUFF((select ', ' + cast(rcA.Event as varchar)
            from Receiving rcA
            where rcA.supplier = 'user'
                and rcA.DATETIME > '20170322'
                and rc.Routage=rcA.Routage
            for xml path(''))
        , 1, 1, '')
from Receiving rc
where rc.supplier = 'user'
    and rc.DATETIME > '20170322'
group by rc.Routage
order by COUNT(distinct rc.Event)desc

这给了我期望的输出,但我想消除 stuff/for xml 路径字段中的重复值。

我尝试了 distinct 的各种组合和 group by在 stuff/xml 部分,但无法将其正确拼凑在一起。

澄清一下,对于 COUNT(distinct rc.Event) = 2,我想从 stuff 子句中看到 2 个不同的事件。我怎样才能做到这一点?

最佳答案

使用 select distinct在子查询中:

select rc.Routage,
       count(distinct rc.Event),
       stuff((select distinct ', ' + cast(rcA.Event as varchar(max))
              from Receiving rcA
              where rcA.supplier = 'user' and
                    rcA.DATETIME > '20170322' and
                    rc.Routage = rcA.Routage
              for xml path('')
             ), 1, 2, '')
from Receiving rc
where rc.supplier = 'user' and rc.DATETIME > '20170322'
group by rc.Routage;

笔记:
  • 在 SQL Server 中,永远不要使用 varchar() (或相关类型)没有长度。默认值因上下文而异,您(可能)引入了一个很难找到的错误。
  • 您想要 stuff()删除两个字符,而不是 1,因为您有一个逗号后跟一个空格。
  • 此公式假设 Event没有 XML 特殊字符。如果这是一个问题,很容易调整。

  • 此外,如果您消除子查询中的重复项,这种类型的查询通常会更快:
    select rc.Routage, rc.numEvents,
           stuff((select distinct ', ' + cast(rcA.Event as varchar(max))
                  from Receiving rcA
                  where rcA.supplier = 'user' and
                        rcA.DATETIME > '20170322' and
                        rc.Routage = rcA.Routage
                  for xml path(''), type
                 ).value('.', 'varchar(max)'
                        ), 1, 2, ''
                )
    from (select rc.Routage, count(distinct rc.Event) as numEvents
          from Receiving rc
          where rc.supplier = 'user' and rc.DATETIME > '20170322'
          group by rc.Routage
         ) rc;
    

    关于sql - 使用不同的东西/for xml 路径 ('' ),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42975074/

    相关文章:

    mysql - ORDER BY 后 GROUP BY 不起作用

    MySQL从表A和表B插入表C

    MySQL 数据库说明

    sql - 在 SQL Server 中连接 2 个数字

    sql - 在类型化的 xml 列上选择节点的原子值

    mysql - MySQL 中何时使用单引号、双引号和反引号

    python - 在sqlalchemy中连接两个没有关系的表

    sql - 在 SQL Server 2008 中输出嵌套的 XML

    sql - 仅当满足条件时才选择特定列

    sql-server-2005 - 将 SSIS 包从 SQL Server 2005 迁移到 2008 时要记住什么?