テーブルAとテーブルBの2つのテーブルがあります。player_id、date、spins、coin_in、および収益をプレーヤーIDと日付に集計しようとしていますが、それらをどのように結合するかわかりません。私はまだSQLにかなり慣れていません。
Table A
| player_id | date | spins | coin_in |
|-----------|------------|-------|---------|
| 252156 | 2020-05-01 | 0 | 0 |
| 252156 | 2020-05-02 | 5 | 100000 |
| 252156 | 2020-05-03 | 1 | 50000 |
| 252156 | 2020-05-04 | 100 | 1000000 |
| 252156 | 2020-05-05 | 10 | 100000 |
| 923451 | 2020-05-04 | 50 | 1000000 |
| 923451 | 2020-05-05 | 5 | 100000 |
Table B
| player_id | date | datetime | revenue |
|-----------|------------|----------------------|---------|
| 252156 | 2020-05-01 | 2020-05-01T22:54:59Z | 9.99 |
| 252156 | 2020-05-01 | 2020-05-01T23:54:59Z | 19.99 |
| 252156 | 2020-05-05 | 2020-05-05T20:54:59Z | 49.99 |
| 252156 | 2020-05-05 | 2020-05-05T21:54:59Z | 99.99 |
| 923451 | 2020-05-04 | 2020-05-04T19:54:59Z | 0.99 |
内部結合を使用してみましたが、特定の日付が返されません。
SELECT A.player_id, A.date, A.spins, A.coin_in, SUM(revenue)
FROM A
INNER JOIN B ON B.player_id = A.player_id
GROUP BY A.player_id;
| player_id | date | spins | coin_in | SUM(revenue) |
|-----------|------------|-------|---------|--------------|
| 252156 | 2020-05-01 | 0 | 0 | 899.8 |
| 923451 | 2020-05-04 | 50 | 1000000 | 1.98 |
最良の答えは、テーブル間のカーディナリティに大きく依存します。
最も安全なアプローチはUNION ALL
であり、各テーブルでユーザーおよび日付ごとに可能な0からNのレコードに対応します。
SELECT player_id, date, SUM(spins), SUM(coin_in), SUM(revenue)
FROM (
SELECT player_id, date, spins, coin_in, null revenue FROM B
UNION ALL SELECT player_id, date, 0, 0, revenue FROM A
) t
GROUP BY B.player_id, date
場合はA
(あなたのサンプルデータに示すように)すべての日付を持って、その後、LEFT JOIN
好ましいであろう-しかし、あなたは、事前に集計をする行を乗じ避ける必要があります。
SELECT a.*, b.revenue
FROM (
SELECT player_id, date, SUM(a.spins) spins, SUM(a.coin_in) coin_in
FROM a
GROUP BY player_id, date
) a
LEFT JOIN (
SELECT player_id, date, SUM(b.revenue) revenue
FROM b
GROUP BY player_id, date
) b ON a.player_id = b.player_id AND a.date = b.date
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加