7

sum、avg、countなどの関数によって、文字列を他の1つ以上のグループと連結することは可能ですか。

次の表があるとしましょう

Id Name Order Value  
1  a    1     100  
2  b    2     200  
3  c    1     300  
4  d    1     100  
5  e    2     300

結果をこのようなものにしたい場合は

Order Name   Value Count  
1     a,c,d  500   3  
2     b,e    500   2  

SQLサーバーでクエリを使用して同じことを実現するにはどうすればよいですか。

4

3 に答える 3

7

サンプルテーブル

create table t123 (Id int, Name varchar(10), [Order] int, Value int)
insert t123 select 
1,'a','1',100 union all select
2,'b','2',200 union all select
3,'c','1',300 union all select
4,'d','1',100 union all select
5,'e','2',300

SQL Server 2005 以降のクエリ

select a.[order], STUFF((
    select ','+b.name
    from t123 b
    where b.[order] = a.[order]
    order by b.name
    for xml path('a'), type).value('.','nvarchar(max)'),1,1,'') Name,
    SUM(a.value) value,
    COUNT(*) [count]
from t123 a
group by a.[order]

出力

order       Name         value       count
----------- ------------ ----------- -----------
1           a,c,d        500         3
2           b,e          500         2
于 2011-04-06T22:31:29.237 に答える
4

これを使ってみてください。

  • 元のクエリを CTE に配置しました。
  • 次に、その中から選択し、順序でグループ化しました。
  • 次に、外側のクエリの注文ごとにカンマで区切られた一連の名前を取得するサブクエリをクロス適用しました。
  • 名前の列も選択したので、名前の列でグループ化する必要もありました。

このような:

;WITH cte(id, n, o, v) as (
   SELECT Id, Name, Order, Value FROM ....
)
SELECT o, names, SUM(v), COUNT(*)
FROM cte AS outer
CROSS APPLY (
    SELECT Name+',' 
    FROM cte AS inner 
    WHERE outer.o = inner.o 
    ORDER BY Name FOR XML PATH('')
) n(names)
group by o, names
于 2011-04-08T06:34:37.023 に答える
1

MS SQL Server 2005 以降を使用している場合は、ユーザー定義の集計関数を作成できます。

MSDN: 集計の作成 (Transact-SQL)

MSDN: CLR ユーザー定義集計関数の呼び出し

于 2011-04-08T06:12:56.013 に答える