【问题标题】:Concatenating a List of of sites and count of occurrences into a column将站点列表和出现次数连接到一列中
【发布时间】:2015-01-07 06:55:29
【问题描述】:

使用此页面:Can I Comma Delimit Multiple Rows Into One Column?

...我已经能够得出这样的结果:

使用这个查询:

SELECT
    [Client ID],
    STUFF((SELECT ', ' + [Location (counts)]
           FROM (
                SELECT TOP 100 PERCENT [Client ID]
                    , ltrim(str([Store Num])) + ' (' + ltrim(str(count([Store Num]))) + ') ' [Location (counts)]
                FROM @tbl_coreData
                GROUP BY [Store Num], [Client ID]
                ORDER BY COUNT([Store Num]) DESC) tblThis 
           WHERE ([Store Num] = Result.[Store Num] 
             AND [Client ID] = Result.[Client ID]) 
           FOR XML PATH ('')),1,1,'') AS BATCHNOLIST
FROM @tbl_coreData AS Result
GROUP BY [Client ID], [Store Num]

我希望列表按出现次数(括号中的数字)排序。我的尝试是

SELECT TOP 100 PERCENT 
    [Client ID]

ORDER BY COUNT([Store Num]) DESC

但这不起作用。

如何使连接的值按出现的降序显示?

一如既往,欢迎并感谢所有帮助。

【问题讨论】:

    标签: sql sql-server tsql subquery concatenation


    【解决方案1】:

    经过一番烦躁和使用霍根的建议,我想出了这个:

    DECLARE @Heroes TABLE (
        [HeroName]      VARCHAR(20),
        [HeroFriend]    VARCHAR(20)
    )
    
    INSERT INTO @Heroes ( [HeroName], [HeroFriend] )
    VALUES  ( 'Superman', 'Aquaman' ), 
            ( 'Superman', 'Batman' ), 
            ( 'Superman', 'Wolverine' ), 
            ( 'Superman', 'Batman' ), 
            ( 'Superman', 'Wolverine' ), 
            ( 'Superman', 'Batman' ), 
            ( 'Superman', 'Ironman' ), 
            ( 'Superman', 'Wolverine' ), 
            ( 'Superman', 'Batman' ), 
            ( 'Superman', 'Ironman' ), 
            ( 'Superman', 'Wolverine' ), 
            ( 'Superman', 'Batman' ), 
            ( 'Superman', 'Ironman' ), 
            ( 'Superman', 'Wolverine' ), 
            ( 'Superman', 'Wolverine' ), 
            ( 'Batman', 'Wolverine' );
    
    with pre as (
      SELECT
        [HeroName],
        count([HeroName]) [locationcount],
        '(' + ltrim(str(count([HeroName]))) + ') ' + [HeroFriend] [Concat]
      FROM @Heroes
      Group By [HeroName],
               [HeroFriend]
    )
    
    Select DISTINCT
           [HeroName],
           STUFF((SELECT ',' + [Concat]
                  FROM (
                        SELECT TOP 100 [HeroName],[Concat]
                        FROM pre
                        order by locationcount desc
                  ) tblThis 
                  WHERE ([HeroName] = Result.[HeroName]
                     )
                  FOR XML PATH ('')),1,1,'') AS [Loc Counts]
    From pre AS Result
    

    由于某种原因,当我尝试进行连接和/或动态排序时,SQL 不太喜欢它。代码可以正常运行,但忽略了排序。但是事先将它们放入“with”块中解决了它。

    【讨论】:

      【解决方案2】:

      类似这样的:

      with pre AS
      (
        SELECT 
          [Client ID],
          ltrim(str([Store Num])) as [Store Num]
          count([Store Num]) as locationcount
        FROM @tbl_coreData
        Group By [Store Num], [Client ID]
      )
      Select [Client ID],
             STUFF((SELECT ', ' + [Location (counts)]
                    FROM (
                      SELECT [Client ID], [Store Num] + ' (' + locationcount + ') ' [Location (counts)]
                      FROM pre
                      Order By locationcount desc
                    ) tblThis 
                    WHERE ([Store Num] = Result.[Store Num] AND [Client ID] = Result.[Client ID]) 
                    FOR XML PATH ('')),1,1,'') AS BATCHNOLIST
      From pre AS Result
      order by locationcount desc
      

      【讨论】:

      • 这很有帮助,因为我从未使用过“WITH”子句。我可以通过将 FROM pre Group By locationcount, [Store Num], [Client ID] 添加到子查询中来对值进行排序,但是默认情况下这是按升序排列的。 Order By 语句在子查询中不起作用,尽管它们也不会引发错误。
      • @n8 在子查询(pre)中应该没有理由按顺序排序。任何时候你使用它,你都会做一个选择,并可以在该选择中添加一个 order by 子句。我不确定您在哪里看不到正确的顺序。
      • 我不明白为什么我对您的答案的编辑被拒绝了,我做了两个小修改以便它可以运行。您的子查询中有一个 order by,也许您的意思是排除它而不是让它工作?至于我上面的评论,我提到使用的 order by 最终没有起作用,看来我的初步结果是我的测试对象集的侥幸。所以这个问题仍然悬而未决。
      • @n8 子查询中的 orderby 应该改变逗号分隔结果的顺序。最后的 order by 应该改变行的顺序。
      猜你喜欢
      • 1970-01-01
      • 2016-05-23
      • 2021-06-02
      • 2023-03-03
      • 2021-09-11
      • 2016-12-26
      • 1970-01-01
      • 2015-04-29
      • 2023-01-17
      相关资源
      最近更新 更多