0

日付ごとに 5 つのクエリを結合した下に、次のような大きなクエリがあります。

--Combined Daily Actions Per Revenue Source-- 
SELECT Two.the_date, 
       sp_dau, 
       cs_dau, 
       tapjoy_ios_dau, 
       tapjoy_android_dau, 
       appcircle_ios_dau, 
       appcircle_android_dau, 
       freecause_dau, 
       portal_dau 
FROM   (SELECT Trunc(Cs.create_dtime) AS The_Date, 
               Count(DISTINCT CASE 
                                WHEN Cs.cs_listing_id LIKE '99999999%' THEN 
                                ( Cs.player_id ) 
                              END)    AS Sp_Dau, 
               Count(DISTINCT CASE 
                                WHEN Cs.cs_listing_id NOT LIKE '99999999%' THEN 
                                ( Cs.player_id ) 
                              END)    AS Cs_Dau 
        FROM   player_chkin_cs Cs 
        WHERE  Trunc(Cs.create_dtime) >= To_date('2012-Jan-01', 'yyyy-mon-dd') 
        GROUP  BY Trunc(Cs.create_dtime)) One 
       INNER JOIN (SELECT Trunc(Tap.create_dtime) AS The_Date, 
                          Count(DISTINCT CASE 
                                           WHEN ( Play.uuid LIKE 'i~%' ) 
                                                 OR ( Play.uuid LIKE 'ti~%' ) 
                                         THEN 
                                           Tap.player_id 
                                         END)     AS Tapjoy_Ios_Dau, 
                          Count(DISTINCT CASE 
                                           WHEN ( Play.uuid LIKE 'a~%' ) 
                                                 OR ( Play.uuid LIKE 'ta~%' ) 
                                         THEN 
                                           Tap.player_id 
                                         END)     AS Tapjoy_Android_DAU 
                   FROM   player_tapjoy Tap 
                          INNER JOIN player Play 
                                  ON Tap.player_id = Play.player_id 
                   WHERE  Trunc(Tap.create_dtime) >= 
                          To_date('2012-Jan-01', 'yyyy-mon-dd') 
                   GROUP  BY Trunc(Tap.create_dtime)) Two 
               ON One.the_date = Two.the_date 
       INNER JOIN (SELECT Trunc(Aux.create_dtime) AS The_Date, 
                          Count(DISTINCT CASE 
                                           WHEN ( Play.uuid LIKE 'i~%' ) 
                                                 OR ( Play.uuid LIKE 'ti~%' ) 
                                         THEN 
                                           Aux.player_id 
                                         END)     AS Appcircle_Ios_Dau, 
                          Count(DISTINCT CASE 
                                           WHEN ( Play.uuid LIKE 'a~%' ) 
                                                 OR ( Play.uuid LIKE 'ta~%' ) 
                                         THEN 
                                           Aux.player_id 
                                         END)     AS AppCircle_Android_DAU 
                   FROM   player_aux_pt Aux 
                          INNER JOIN player Play 
                                  ON Aux.player_id = Play.player_id 
                   WHERE  Aux.site = 'AppCircle' 
                          AND Trunc(Aux.create_dtime) >= 
                              To_date('2012-Jan-01', 'yyyy-mon-dd') 
                   GROUP  BY Trunc(Aux.create_dtime))Three 
               ON Two.the_date = Three.the_date 
       INNER JOIN (SELECT Trunc(Aux.create_dtime)       AS The_Date, 
                          Count(DISTINCT Aux.player_id) AS FreeCause_DAU 
                   FROM   player_aux_pt Aux 
                   WHERE  Aux.site = 'ext : freecause' 
                          AND Trunc(Aux.create_dtime) >= 
                              To_date('2012-Jan-01', 'yyyy-mon-dd') 
                   GROUP  BY Trunc(Aux.create_dtime))Four 
               ON Three.the_date = Four.the_date 
       INNER JOIN (SELECT Trunc(Aux.create_dtime)       AS The_Date, 
                          Count(DISTINCT Aux.player_id) AS Portal_DAU 
                   FROM   player_aux_pt Aux 
                   WHERE  ( Aux.site = 'Portal : Promotion' 
                             OR Aux.site = 'Portal : RadiumOne' 
                             OR Aux.site = 'Portal : Paymentwall' 
                             OR Aux.site = 'Portal : TrialPay' ) 
                          AND Trunc(Aux.create_dtime) >= 
                              To_date('2012-Jan-01', 'yyyy-mon-dd') 
                   GROUP  BY Trunc(Aux.create_dtime)) Five 
               ON Four.the_date = Five.the_date 

サブクエリのほとんどは、2012-Jan-01現在までのデータしかないものを除いて、現在までの範囲09-Jul-12です。

したがって、このクエリを実行すると、結果の最初の日付は09-Jul-12and notになり01-Jan-12ます。

Jan 011 つを除くすべてのクエリに関連データがあるから結果を取得するにはどうすればよいですか?

4

1 に答える 1

2

問題は、日付が一致しないために日付が脱落していることです。あなたの質問への答えはLEFT OUTER JOIN代わりにですINNER JOIN。これにより、最初のテーブル (結合の左側) にすべての行が保持され、次のテーブルに一致する情報があれば保持されます。一致しない場合、すべての値が NULL になります。

最初のテーブルに必要なすべての日付があると仮定して、後続のすべてのクエリで結合を変更します。

NULL の代わりに 0 が必要な場合coalesce()は、select句で使用して変換します。

于 2012-09-27T18:07:18.520 に答える