我有下表:
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
我非常感谢任何帮助。
答案 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 >
ImplicitCast = cast(@gt as varchar(10)), -- varchar, encoded as >
ValuesMethod = @gt.value('.', 'varchar(10)') -- varchar, encoded as >
或其他几个字符等特殊字符,则会对其进行HTML编码。因此,如果你有这样的角色,按照自己的方式去实际上是保持这样的角色的唯一方法。我从昨天起就不知道这件事,但是在看到你的帖子之后今天就开始搞乱了,谢谢!
示例:
class MyClass():
content = {}
obj = MyClass()