-2

以下の私のクエリを参照してください:

select I.OID_CUSTOMER_DIM, I.segment  as PISTACHIO_SEGMENT,
   MAX(CASE WHEN S.SUBSCRIPTION_TYPE = '5' THEN 'Y' ELSE  'N' END ) PB_SUBS,
   max(case when S.SUBSCRIPTION_TYPE ='12' then 'Y' else 'N' end) DAILY_TASTE,
   MAX(CASE WHEN S.SUBSCRIPTION_TYPE ='8' THEN 'Y' ELSE 'N' END) COOKING_FOR_TWO
FROM WITH_MAIL_ID i   JOIN CUSTOMER_SUBSCRIPTION_FCT S
ON I.IDENTITY_ID = S.IDENTITY_ID 
WHERE S.SITE_CODE ='PB'and S.SUBSCRIPTION_END_DATE is  null
group by I.oid_customer_dim, I.segment

これでは、654105行を取得しています。これは、706795行の結合テーブルの1つよりも低くなっwith_mail_idています。

さて、qcの目的で、私のマネージャーは、なぜ私が最終的なテーブルにすべての行を持っていないのか疑問に思っています。すべてのフィルターを削除しようとしましたが、結果は両方のテーブルで同じではありません。私は何が間違っているのですか?

私はまだSQLがあまり得意ではなく、このことは本当に私を混乱させます。

4

1 に答える 1

2

2 つのテーブルで内部結合を行っているため、CUSTOMER_SUBSCRIPTION_FCT に対して結合できる WITH_MAIL_ID からの行のみが返されます。さらに、グループ句があります。

まずは合体。結合条件に関係なくすべての行を返したい場合は、left joinを使用できますが、この場合、すべての S. 列が NULL になるため、それに対処する必要があります。

これを実行すると、カウントが異なることがわかります。

select count(*) from WITH_MAIL_ID i
left join CUSTOMER_SUBSCRIPTION_FCT S 
    on I.IDENTITY_ID = S.IDENTITY_ID
where s.IDENTITY_ID is NULL

ただし、最も可能性が高いのは、それが単なるグループ化であるということです。2 つの列でグループ化し、そのグループ化に基づいて他のさまざまな列の最大値を選択する場合、返される行数は元のテーブルよりも少ないと予想されます。

次のようなデータがある場合:

groupkey1  value
1          2
1          10
2          1
2          1

次に、groupkey1 でグループ化し、MAX(value) を選択すると[1,2], [2,1]、4 行ではなく 2 行になります。

于 2012-04-13T21:14:45.120 に答える