2011-02-01 10 views
1

以下の例を簡略化して説明しましたが、記述したとおりの結果が本当に必要であることをご存知でしょうか。SQL Serverの水平DISTINCT COUNTまたは重複カウントを持たないCOUNT IF

私は、どのように参照されたかを含む顧客に関する情報を含むテーブルを持っています。たとえばMyTableについては (EDIT:私は簡素化の上に働かない答えになった彼らは良い答えですが、私の問題を解決しない、私は明確にするため、パズルの最後のピースを追加した。。):

STORE CUS_ID REFERRED MONEYMADE 
1  11  RADIO   10.00 
1  15  WALKIN  20.00 
1  11  RADIO   30.00 
2  12  RADIO   40.00 
2  12  RADIO   50.00 
3  13  WALKIN  60.00 
3  14  WALKIN  70.00 

私はDISTINCTの数を数え、特定のタイプによって参照され、ストアごとにグループ化された顧客をカウントしたいと思います。私が行うことができ、以下:

STORE RADIO RADIO_MONEY WALKIN WALKIN_MONEY 
1  1  40.00   1   20.00 
2  1  90.00   0   0.00 
3  0  0.00   2   130.00 

私はSUMを使用してクエリを実行しようとしましたと:

STORE COUNTEM REFERRED MONEYMADE 
1  1   RADIO  40.00 
1  1   WALKIN  20.00 
2  1   RADIO  90.00 
3  2   WALKIN  130.00 

は、しかし、私は本当にこのような結果が必要:

SELECT 
    STORE, COUNT(DISTINCT CUS_ID) AS COUNTEM, 
    REFERRED, SUM(MONEYMADE) 
FROM MyTable 
GROUP BY REFERRED, STORE 

これは、次のような結果になりますCASEは重複を数えます。

SELECT 
    STORE, 
    SUM (CASE REFERRED WHEN 'RADIO' THEN 1 ELSE 0 END) AS RADIO, 
    SUM (CASE REFERRED WHEN 'RADIO' THEN MONEYMADE ELSE 0 END) AS RADIO_MONEY, 
    SUM (CASE REFERRED WHEN 'WALKIN' THEN 1 ELSE 0 END) AS WALKIN 
    SUM (CASE REFERRED WHEN 'WALKIN' THEN MONEYMADE ELSE 0 END) AS WALKIN_MONEY, 
FROM MyTable 
GROUP BY STORE 

戻り、この誤った結果:たとえば

STORE RADIO RADIO_MONEY WALKIN WALKIN_MONEY 
1  2  40.00   1   20.00 
2  2  90.00   0   0.00 
3  0  0.00   2   130.00 

はこれをやってのけるする方法はありますか?私は "count if"型の関数を探しましたが、唯一見つかったのはsum - caseメソッドです。

答えて

4

EDIT別のフィールドをSUMする必要があるためです。あなたはSUM/CASE前に合計を行う必要があります

自己完結型のサンプルデータ--USING

--TEST DATA 
DECLARE @MyTable table 
(STORE int, CUST_ID int , Referred varchar(6) ,MONEYMADE Money) 

INSERT INTO @MyTable VALUES 
(1,  11,  'RADIO' ,  10.00) 
INSERT INTO @MyTable VALUES 
(1,  15,  'WALKIN',  20.00) 
INSERT INTO @MyTable VALUES 
(1,  11,  'RADIO' ,  30.00) 
INSERT INTO @MyTable VALUES 
(2,  12,  'RADIO' ,  40.00) 
INSERT INTO @MyTable VALUES 
(2,  12,  'RADIO' ,  50.00) 
INSERT INTO @MyTable VALUES 
(3,  13,  'WALKIN',  60.00) 
INSERT INTO @MyTable VALUES 
(3,  14,  'WALKIN',  70.00) 

PIVOT

SELECT 
    pk.STORE, 
    pk.RADIO, 
    pk.WALKIN, 
    ISNULL(pv.RADIO,0) as RADIO_MONEY, 
    ISNULL(pv.WALKIN,0)as WALKIN_MONEY 

FROM 
(SELECT STORE, 
      REFERRED , 
      MONEYMADE 
    FROM @MyTable) p 
      PIVOT (SUM(MONEYMADE) FOR REFERRED in (WALKIN, RADIO)) as pv 
    INNER JOIN   
(SELECT DISTINCT STORE, 
        REFERRED , 
        CUST_ID 
    FROM @MyTable) p 
      PIVOT (COUNT (CUST_ID) FOR REFERRED in (WALKIN, RADIO)) as pk 
    ON pv.store = pk.STORE 

--without使用PIVOT

SELECT 
    STORE, 
    SUM(CASE REFERRED WHEN 'RADIO' THEN 1 ELSE 0 END)AS RADIO, 
    SUM(CASE REFERRED WHEN 'WALKIN' THEN 1 ELSE 0 END)AS WALKIN, 
    SUM(CASE REFERRED WHEN 'RADIO' THEN MONEYMADE ELSE 0 END)AS RADIO_MONEYMADE, 
    SUM(CASE REFERRED WHEN 'WALKIN' THEN MONEYMADE ELSE 0 END)AS WALKIN_MONEYMADE 
FROM 
    (

SELECT 
    STORE, 
    CUST_ID, 
    REFERRED , 
    SUM(MONEYMADE)MONEYMADE 
    FROM 
    @MyTable p 
    GROUP BY 
    STORE, 
    REFERRED, 
    CUST_ID 


) t 
group by store 

O utput両方のテクニックについて

STORE  RADIO  WALKIN  RADIO_MONEY   WALKIN_MONEY 
    ----------- ----------- ----------- --------------------- --------------------- 
    1   1   1   40.00     20.00 
    2   1   0   90.00     0.00 
    3   0   2   0.00     130.00 
+0

申し訳ありませんが、私はこれが動作しないようにする列がいくつか追加されています。言い換えれば、他の列は行を一意にします。元の投稿を編集します。これは良い提案ですが、私はそれを感謝します。 @LittleTreeX。 – LittleTreeX

+0

編集は役に立たなかった。 3つの列にDISTINCTを入力すると、ダンプが削除されます。その後、SUM/CASEを実行すると、それはうまくいくはずです –

+0

私の問題を(うまくいけば)明確にするために私の質問をもう一度編集しました。なぜこの解決策はうまくいかないと思いますか?私は、この答えは、元々書かれたように(混乱のために申し訳ありませんが、助けてくれてありがとう)私の質問に答えていると言いたいと思います。 – LittleTreeX

0

回転SQLの結果は、少なくともトリッキーです。クエリからデータを正しく表示したい場合は、クエリの柔軟性を犠牲にし、十分な情報(列名やその数など)をハードコードする必要があります。

私が提案したいのは、クエリが実際に使用されるバックエンドでもう少しやってみたいということです。それは許容だとあなたが結果を回転させることができ、自分自身が、あなたは、次のことができる場合:

;with R(Referred) as (
    select distinct REFERRED from MyTable 
) 
select t.STORE, COUNT(*) as COUNT, t.REFERRED 
from MyTable t 
    left join R on r.REFERRED = t.REFERRED 
group by t.STORE, t.REFERRED 
0

ここ準拠するように変更スクリプトだ、私はあなたが達成しようとしているものと、考える:

SELECT 
    STORE, 
    COUNT(DISTINCT CASE REFERRED WHEN 'RADIO' THEN CUS_ID END) AS RADIO, 
    SUM (CASE REFERRED WHEN 'RADIO' THEN MONEYMADE ELSE 0 END) AS RADIO_MONEY, 
    COUNT(DISTINCT CASE REFERRED WHEN 'WALKIN' THEN CUS_ID END) AS WALKIN 
    SUM (CASE REFERRED WHEN 'WALKIN' THEN MONEYMADE ELSE 0 END) AS WALKIN_MONEY, 
FROM MyTable 
GROUP BY STORE 
関連する問題