2017-07-13 6 views
1

を下降することによって、単一の行に複数の行を結合し、私は以下のこのテーブルがあります。ためのSQL

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

を、私はスタイルを持ってテーブルを取得したいし、すべての色は、カンマで区切られますが、中利用可能なQUANTITIES(Qty)の降順である。 QtyのSUMを別の列に入力します。私はほとんど私に欲しいものを私に与えるコードがありますが、私は正しい順序で色を持つようにそれを変更する方法を知らない。

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 

私は非常に任意の助けをいただければ幸いです。

答えて

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; 
+0

私は、DISTINCT削除TYPE()やVALUE()、そしてそれは、ORDER BYで今働いています!ありがとうございました! – Monika

1
;with src (Style, Color, Qty) as 
(
    select 'Style1', 'Red', 10 union all 
    select 'Style1', 'Black', 15 union all 
    select 'Style1', 'White', 7 union all 
    select 'Style2', 'Yellow', 10 union all 
    select 'Style2', 'Green', 8 union all 
    select 'Style3', 'White', 15 union all 
    select 'Style3', 'Black', 20 
) 
select 
    Style, 
    SumQty = sum(Qty), 
    Color = stuff((select ',' + i.Color 
        from src i 
        where o.Style = i.Style 
        order by i.Qty desc 
        for xml path('')), 1, 1, '') 
from src o 
group by Style 

あなたは私がする必要性を感じたXML

のためにあなたのtypevalue()部品を必要としませんこれを修正してください。 9/10倍であれば、valuetypeは必要ありません。ただし、シリアル化しているテキストに>,<などの特殊文字が含まれていると、HTMLでエンコードされます。だからあなたがそのようなキャラクターを持っているなら、それをあなたのやり方にすることは、実際にそういうものとして保つ唯一の方法です。私は昨日のようにこのことを知らなかったが、あなたのポストを見た後に今日それを混乱させ始めたので、ありがとう!

例:

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 > 
関連する問題