2017-08-01 12 views
0

次の2つのテーブルからデータを抽出したいと思います。添付の​​画像The data that I am afterを参照してください。私の目的は、1日あたりの積極的な選手から独立した預金者の数を得ることです。つまり、プレイヤーが入金されてもプレイしなかった場合でも、プレイヤーを数えたいと思うでしょう。2つのPostgreSQLテーブルのデータを1つにまとめる

私は次のコードを使用していますが、結果は私の後ではありません - 画像The data that I am gettingを参照してください。カントリーごとに行ごとにcalendar_date(2017-01-01)が1つしか得られません。両方の日付のデータが1つに合計されています&どの国にも属していない別のデータ行があります(預金者& Total_Deposit_Amount)。このデータは、各国間で配布する必要があります。

--temporary table for start_date 
WITH Temp_Start_Date as 
(
select CAST('2017-01-01' AS date) 
), 

--temporary table for end_date 

Temp_End_Date as 
(
select CAST('2017-01-03' AS Date) 
), 

--temporary table for calendar date 
Temp_Calendar_Date as 
(
    SELECT 1 as LinkDate 
     ,calendar_date::date from generate_series('2017-01-01', 
      CURRENT_DATE -212, '1 day'::interval) calendar_date 

), 

--temporary table for bet_transactions 
Temp_bet_transactions AS 
(
     SELECT BT.account_id 
     , P.username 
     , CASE 
      WHEN P.country_code = '1' then '1' 
      WHEN P.country_code = '2' then '2' 
      WHEN P.country_code = '3' then '3' 
      WHEN P.country_code = '4' then '4' 
      WHEN P.country_code = '5' then '5' 
      WHEN P.country_code = '6' then '6' 
      ELSE '7' 
     END AS Country 
     , 1 AS LinkDate 
     , SUM(CAST(CAST(money_amount_cents AS DECIMAL (18,2))/100 AS DECIMAL (18,2))) AS Turnover 
    FROM accounts A 
    JOIN players P ON A.player_id = P.id 
    JOIN ONLY bet_transactions BT ON A.id = BT.account_id 
    WHERE BT.created_at >= (SELECT * FROM Temp_Start_Date) 
     AND BT.created_at < (SELECT * FROM Temp_End_Date) 
     AND BT.status = 'accepted' 
     AND amount_cents <> 0 
    GROUP BY 
     1, 2, 3 
), 

--temporary table for depositors 
Temp_depositors AS 
(
    SELECT account_id 
     , 1 AS LinkDate 
     , SUM(CAST(CAST(money_amount_cents AS DECIMAL (18,2))/100 AS DECIMAL (18,2))) AS Total_Deposit_Amount 
    FROM deposit_transactions D 
    WHERE D.created_at >= (SELECT * FROM Temp_Start_Date) 
      AND D.created_at < (SELECT * FROM Temp_End_Date) 
      AND status = 'accepted' 
    GROUP BY 
     1, 2 
) 

--get result 
SELECT TCD.calendar_date 
    , BT.country 
    , COUNT(DISTINCT BT.account_id) AS Active_Players 
    , COUNT(DISTINCT DT.account_id) AS Depositors 
    , SUM(DT.Total_Deposit_Amount) AS Total_Deposit_Amount 
    , SUM(BT.Money_Bet) AS Turnover 
FROM Temp_Calendar_Date TCD 
JOIN Temp_bet_transactions BT ON TCD.LinkDate = BT.LinkDate 
FULL OUTER JOIN Temp_depositors DT ON BT.account_id = DT.account_id 
GROUP BY 
    1,2 

ご協力いただければ幸いです。

おかげ ステファン

答えて

0

私はここで聞いているようなコメントを作るために評判に低いにしています。

Temp_Calendar_Dateには、(2017-01-01)のが含まれているため、これ以降はグループ化しているためです。

テストデータを生成するためにいくつかの挿入を提供する方がはるかに簡単です。

ところで、LinkDateとは何ですか? Wyこれは常に1と等しいですか?

+0

カレンダーの日付でデータをグループ化するためのダミー列として、Linkdateが使用されています –

関連する問題