1

次のようなテーブルがあります。

ID    Type
----------
1     sent
1     sent
1     open
1     bounce
1     click
2     sent
2     sent
2     open
2     open
2     click

次のような結果を返すクエリが必要です。

ID    sent    open    bounce    click
1     2       1       1         1
2     2       2       0         1

それを行う方法を理解することはできません。ありがとう。

4

3 に答える 3

2

ピボットを試す

SELECT ID,[sent],[open],[bounce],[click]
FROM   your_table
PIVOT (COUNT([Type]) 
FOR   [Type] in ([sent],[open],[bounce],[click]))p


SQL フィドルのデモ

于 2012-09-07T11:36:38.730 に答える
0
Select Id, 
count(case When type='sent' then 1 else 0 end) as sent,
count(case when type='open' then 1 else 0 end) as open
From table
Group by Id

それで正確な答えが得られない場合は、 count を試してください(個別のケース....):)

于 2012-09-07T11:36:45.780 に答える
0

PIVOTまたはを使用してそのような結果を取得できます。列GROUP BYに変数値がある場合でも結果を取得できます。Type

テストデータ:

CREATE TABLE #t(ID    INT, Type VARCHAR(100))
INSERT #t 
VALUES 
(1,     'sent'),
(1,     'sent'),
(1,     'open'),
(1,     'bounce'),
(1,     'click'),
(2,     'sent'),
(2,     'sent'),
(2,     'open'),
(2,     'open'),
(2,     'click')

PIVOTアプローチ:

SELECT  pvt.*
FROM    #t
PIVOT
(
    COUNT(Type) FOR Type IN ([sent], [open], [bounce], [click])
) pvt

に他の可能な値がTypeあり、それらを事前に知らない場合は、 dynamic を使用しますPIVOT

DECLARE @cols NVARCHAR(1000) = STUFF(
(
    SELECT  DISTINCT ',[' + Type + ']'
    FROM    #t
    FOR     XML PATH('')
), 1, 1, '')

DECLARE @query NVARCHAR(2000) = 
'
SELECT  pvt.*
FROM    #t
PIVOT
(
    COUNT(Type) FOR Type IN ('+@cols+')
) pvt   
'

EXEC(@query)

の固定値がわかっている場合はType、次も使用できます。

SELECT  ID,
        COUNT(CASE WHEN Type = 'sent' THEN 1 END) [sent],
        COUNT(CASE WHEN Type = 'open' THEN 1 END) [open],
        COUNT(CASE WHEN Type = 'bounce' THEN 1 END) bounce,
        COUNT(CASE WHEN Type = 'click' THEN 1 END) click
FROM    #t
GROUP   BY ID
于 2012-09-07T11:34:38.203 に答える