0

我不确定如何以 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 中做到这一点?给我想要做的名字加分,因为知道如何谷歌这个会有很大帮助:)

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 回答