通过降序SQL将单行中的多个行组合在一起

时间:2017-07-13 17:23:51

标签: sql sql-server

我有下表:

Style   | Color   | Qty
------------------------
Style1  | Red     | 10
Style1  | Black   | 15
Style1  | White   | 7
Style2  | Yellow  | 10
Style2  | Green   | 8
Style3  | White   | 15
Style3  | Black   | 20

我希望得到一个表,它将使用Style,然后用逗号分隔所有颜色,但按可用QUANTITIES(Qty)的降序排列;和另一栏中的数量的和。我的代码几乎给了我想要的东西,但我不知道如何修改它,因为我的颜色正确。

SELECT DISTINCT A.Style, sum(Qty) as  SumQty,  
  STUFF((SELECT distinct ',' + p.Color  
         FROM inv  as P  
         WHERE A.Style = p.Style  
            FOR XML PATH(''), TYPE  
            ).value('.', 'NVARCHAR(MAX)')  
        ,1,1,'') AS Color  
from inv As A  
group by A.style

结果表应该是:

Style   |     Color          | SumQty
-------------------------------------
Style1  | Black, Red, White  |   32
Style2  | Yellow, Green      |   18
Style3  | Black, White       |   35

我非常感谢任何帮助。

2 个答案:

答案 0 :(得分:1)

我认为你只需要在子查询中使用ORDER BY

select i.Style, sum(i.Qty) as SumQty,
       STUFF( (SELECT ',' + i2.Color
               FROM inv i2
               WHERE i2.Style = i.Style
               ORDER BY i2.Qty DESC
               FOR XML PATH(''), TYPE
              ).value('.', 'NVARCHAR(MAX)'
                     ), 1, 1,'') AS Color
from inv i
group by A.style;

答案 1 :(得分:1)

type

您不需要FOR XML的value()value部分

我觉得有必要纠正这个问题。 9/10次,您不需要type>。但是,如果您要序列化的文字包含<declare @gt xml = '>' select RawXML = @gt, -- > XML, encoded as &gt; ImplicitCast = cast(@gt as varchar(10)), -- varchar, encoded as &gt; ValuesMethod = @gt.value('.', 'varchar(10)') -- varchar, encoded as > 或其他几个字符等特殊字符,则会对其进行HTML编码。因此,如果你有这样的角色,按照自己的方式去实际上是保持这样的角色的唯一方法。我从昨天起就不知道这件事,但是在看到你的帖子之后今天就开始搞乱了,谢谢!

示例:

class MyClass(): 
    content = {}
obj = MyClass()