0

Google が理解できるような方法でこの質問をする方法がわかりません。2 つのテーブルを結合したままにして、空白のフィールドを埋めたいと思います。これが私が取り組んでいるものです。

tbl1
| user | date  | usage |
| us1  | 01/12 |  503  |
| us1  | 02/12 |  245  |
| us1  | 03/12 |  465  |
| us2  | 02/12 |  327  |
| us2  | 03/12 |  204  |
| us3  | 02/12 |  156  |

tbl2
| dates | avg_use |
| 01/12 |   345   |
| 02/12 |   426   |
| 03/12 |   502   |

Desired output
| user | date  | usage  |  pct_of_avg  |
| us1  | 01/12 |  503   |     1.45     |
| us1  | 02/12 |  245   |     .58      |
| us1  | 03/12 |  465   |     .93      |
| us2  | 01/12 | (null) |      0       |
| us2  | 02/12 |  327   |     .95      |
| us2  | 03/12 |  204   |     .41      |
| us3  | 01/12 | (null) |      0       |
| us3  | 02/12 |  156   |     .37      |
| us3  | 03/12 | (null) |      0       |

私は JOIN をよく理解しているので、tbl1.user のデータが存在しないため、通常の JOIN ではこれを実行できないことを認識しています。SQLでこれを行う方法はありますか? これをグーグルで検索する方法を知るだけで大​​いに役立つので、私がやろうとしていることに名前を付けることに対するボーナスポイント:)

4

2 に答える 2

3

これはそれを行う必要があります:

SELECT U.user, T2.dates date, T1.usage, T1.usage/T2.avg_use pct_of_avg  
FROM (SELECT DISTINCT user FROM tbl1) U
CROSS JOIN tbl2 T2
LEFT JOIN tbl1 T1
    ON T2.date = T1.date  AND U.user = T1.user
于 2012-11-15T18:42:41.687 に答える
2

Oracleバージョン10g以降の場合は、の拡張によるパーティションouter joinを使用して、データのギャップを埋めることができます。必要なコードは少なくなります。よりシンプルに、より速くなります。

SQL> select t.user1
  2       , to_char(t1.dates, 'mm/yy') as date1
  3       , t.usage1
  4       , round((nvl(t.usage1, 0)/t1.avg_use), 2)  as pct_of_avg
  5   from tbl1 t
  6   partition by(t.user1)
  7   right join tbl2 t1
  8      on (t.date1 = t1.dates)
  9  ;

USER1 DATE1     USAGE1 PCT_OF_AVG
----- ----- ---------- ----------
us1   01/12        503       1.46
us1   02/12        245       0.58
us1   03/12        465       0.93
us2   01/12                     0
us2   02/12        327       0.77
us2   03/12        204       0.41
us3   01/12                     0
us3   02/12        156       0.37
us3   03/12                     0

9 rows selected
于 2012-11-15T19:23:22.513 に答える