【问题标题】:Grouping the data by (day) and then Join the 2 tables together in Oracle按(天)分组数据,然后在 Oracle 中将 2 个表连接在一起
【发布时间】:2017-08-06 09:39:11
【问题描述】:

有两个表licensesorganization

许可表包含 5 列

oracle_apps       tableau      sab_bi      tririga     time_snapshot
0                  1            1           1          2017-06-13 08:12:02.640
0                  0            0           1          2017-06-13 09:12:02.640
0                  0            1           0          2017-06-13 11:52:02.640
0                  1            0           1          2017-06-14 09:12:02.640   
0                  0            1           0          2017-06-14 10:12:02.640

组织表有 2 列

license_name                 license_count
oracle_                      5.0000000
tableau_                     1.0000000
sab_                         20.0000000 
tririga_                     10.0000000 

因此输出将包含两个表的连接的选择查询或 pl SQL 存储过程,它将显示一天使用了多少许可证(计数)

输出:

 oracle_apps    tableau    sab_bi    tririga    time_snapshot  oracle_    tableau_    sap_        tririga_  

 0              1          2         2          2017-06-13     5.0000000  1.0000000   20.0000000  10.0000000
 0              1          1         1          2017-06-14     5.0000000  1.0000000   20.0000000  10.0000000  

例如: 2017-06-13 总共使用了 5 个许可证,并且分别0,1,2,2 即 sum(oracle_apps)、sum(tableau)、sum(sab_bi)、sum(tririga) 和 lly,在 2017 年 6 月 14 日,总共使用了 3 个许可证,即 (0, 1, 1, 1)

使用 group by to_char(time_snapshot, yyyy-mm-dd) 很容易,但我无法加入表格并将行用作列,因为在组织表中,该行将列在输出中,我知道使用 PIVOT 的一种方法,但我很困惑如何在结果中得到它,并且对于每一行 license_name 值将相同,即 ( 5.0000000 | 1.0000000 | 20.0000000
| 10.0000000)

那么有没有将数据分组并加入表格的解决方案?

【问题讨论】:

  • 你试过什么?如果您有错误,那么一定有一些查询引发了这些错误,请将此查询附加到问题中。
  • 对不起兄弟,我使用的查询只是对一天进行分组.. 不知道如何加入和使用行作为列,请您提供一个完整的解决方案

标签: sql oracle plsql


【解决方案1】:

使用CROSS JOINSUMMAXCASE..WHEN..THEN..GROUP BY

SELECT trunc( l.time_snapshot) As time_snapshot,
       sum( l.oracle_apps ) As oracle_apps,
       sum( l.tableau ) As tableau,
       sum( l.sab_bi  ) As sab_bi,
       sum( l.tririga ) As tririga,
       max( CASE WHEN o.license_name = 'oracle_' THEN o.license_count END ) As oracle_,
       max( CASE WHEN o.license_name = 'tableau_' THEN o.license_count END ) As tableau_,
       max( CASE WHEN o.license_name = 'sab_' THEN o.license_count END ) As sab_,
       max( CASE WHEN o.license_name = 'tririga_' THEN o.license_count END ) As tririga_
FROM licenses l
CROSS JOIN organization o 
GROUP BY trunc( l.time_snapshot)

演示:http://sqlfiddle.com/#!4/24b53/5

【讨论】:

  • 老兄再次检查你的输出交叉连接适用于所有 4 列,这就是为什么值变成 4 倍(总和):) sqlfiddle.com/#!4/24b53/5
【解决方案2】:

我建议您在加入之前转置数据:

select l.dte, l.oracle_apps, l.tableau, l.sab_bi, l.tririga,,
       o.oracle_, o.tableau_, o.sab_, o.tririga_
from (select trunc(l.time_snapshot) as dte,
             sum(l.oracle_apps) as oracle_apps,
             sum(l.tableau) as tableau,
             sum(l.sab_bi) as sab_bi,
             sum(l.tririga) as tririga
      from licenses l
      group by trunc(l.time_snapshot)
     ) l cross join
     (select sum(case when license_name = 'oracle_' then license_count else 0 end) as oracle_,
             sum(case when license_name = 'tableau_' then license_count else 0 end) as tableau_,
             sum(case when license_name = 'sab_' then license_count else 0 end) as sab_,
             sum(case when license_name = 'tririga_' then license_count else 0 end) as tririga_        
      from organization o
     ) o;

对我来说,聚合单个表似乎更安全(如果 oracle_ 在组织表中出现两次,您的 license 计数将被取消)。此外,生成的查询可能会更快,因为对单个表的优化通常比对多个表的优化更容易。

【讨论】:

  • 嗯,这是很好的解释和优化的解决方案...... Thkx
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-18
  • 1970-01-01
  • 1970-01-01
  • 2020-02-06
  • 2012-10-05
相关资源
最近更新 更多