我不确定如何以Google会理解的方式提出这个问题。我想离开加入两个表并填写空白字段。这是我正在使用的内容:
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,所以我知道典型的JOIN将无法执行此操作,因为tbl1.user中的数据将不存在。有没有办法在SQL中执行此操作?给予我正在尝试做名字的奖励积分,因为只知道谷歌如何帮助很多:)
答案 0 :(得分: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
答案 1 :(得分: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
扩展名来填补数据空白。您将需要更少的代码。它会更简单,更快。
{{1}}