【问题标题】:SQL Server select and combine values across rows with equal columnsSQL Server 跨行选择和组合具有相等列的值
【发布时间】:2016-01-13 03:15:07
【问题描述】:

我发现有几个问题对此有一点影响,但在这种情况下没有什么能满足我的所有需求。不幸的是,我在 SQL 方面还不够好,无法将它们放在一起。

基本上,我从一个表中选择了几行,我只想为一列选择具有不同值的行,但要结合从不同列中隐藏的所有行的值,并在显示的行中显示该总和.

另外,我想仅从 1 列中选择不同的值。

这是一个例子:

ID  #_of_Items  Place   Description
=======================
1        2       CA     towels
2        4       NY     shirts
3        1       MA     hats
4        3       CA     shorts
4        2       CA     pins
4        4       NY     socks

我想选择:

Place    #_of_Items
=======================
CA        7
NY        8
MA        1

只需要两列 - 基本上,该位置是唯一的,但它会从隐藏行中获取所有 #_of_items 的总和,并将它们添加到它显示的每个状态的一行中。

然后,如果可能的话,我还想选择描述列中所有不同条目的组合,所以:

"towels, shirts, hats, shorts, pins, socks"

我希望这是有道理的。

提前非常感谢大家!

【问题讨论】:

    标签: sql-server select distinct concat


    【解决方案1】:

    如果您可以在数据库中创建用户定义的函数(替换为您的表名):

    CREATE FUNCTION dbo.JoinItems(@place nvarchar(10))
        RETURNS NVARCHAR(MAX)
    AS
    BEGIN
        DECLARE @list NVARCHAR(MAX)
        SELECT @list = CASE WHEN @list IS NULL THEN N'' ELSE @list + N', ' END + description
          FROM <table>
         WHERE place = @place
        RETURN @list
    END
    GO
    

    然后您可以在查询中使用它来返回项目计数以及特定于该地点的项目列表(同样,替换为您的表名):

    SELECT place,
           [#_of_Items] = SUM([#_of_Items]),
           Items = dbo.JoinItems(place)
      FROM <table>
     GROUP BY place 
    

    【讨论】:

      【解决方案2】:

      SQL 2005+:

      SELECT ID, Place, Description
            SUM(#_of_Items) OVER(PARTITION BY Place) AS #_of_Items
      FROM Your_Table
      

      【讨论】:

      • 感谢您的回复!我会和上面的一起试一试。
      猜你喜欢
      • 2014-07-14
      • 2014-12-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多