Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 按天分组数据,然后在Oracle中将这两个表连接在一起_Sql_Oracle_Plsql - Fatal编程技术网

Sql 按天分组数据,然后在Oracle中将这两个表连接在一起

Sql 按天分组数据,然后在Oracle中将这两个表连接在一起,sql,oracle,plsql,Sql,Oracle,Plsql,有两个表许可证和组织 许可证表包含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

有两个表许可证组织

许可证表包含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
组织表有两列

license_name                 license_count
oracle_                      5.0000000
tableau_                     1.0000000
sab_                         20.0000000 
tririga_                     10.0000000 
因此,输出将是一个select查询或pl SQL存储过程,它将包含两个表的联接,并显示一天使用的许可证数量(计数)

输出: 例如:2017年6月13日总共使用了5个许可证,分别为0,1,2,2个,即sum(oracle应用程序)、sum(表格)、sum(sab_bi)、sum(tririga) 2017-06-2014年,总共使用了3个许可证,即(0,1,1,1)

通过使用分组到字符(时间快照,yyyy-mm-dd),事情变得很简单但我无法联接表并使用行作为列,因为在组织表中,行将列在输出中,我知道使用透视的一种方法,但我不知道如何在结果中得到它,并且对于每一行,许可证名称值将是相同的,即。(5.0000000 | 1.0000000 | 20.0000000
|10.0000000)


那么,是否有一种将数据分组并将表连接在一起的解决方案?

使用
交叉连接
求和
最大值
大小写..何时..然后..
分组方式

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)

演示:

使用
交叉连接
求和
最大值
案例..当..然后..
分组方式

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)

演示:

我建议您在加入之前先关注数据:


在各个表上进行聚合对我来说似乎更安全(如果
oracle\uu
在organization表中出现两次,您的许可证计数将被关闭)。此外,生成的查询可能更快,因为在单个表上进行优化通常比在多个表上进行优化更容易。

我建议您在加入之前先透视数据:


在各个表上进行聚合对我来说似乎更安全(如果
oracle\uu
在organization表中出现两次,您的许可证计数将被关闭)。此外,生成的查询可能更快,因为在单个表上进行优化通常比在多个表上进行优化更容易。

您尝试了什么?如果出现错误,则一定有某个查询抛出了这些错误,请将此查询附加到问题。抱歉,兄弟,我使用的查询只是对一天进行分组。。不要知道如何加入并使用行作为列你可以提供一个完整的解决方案吗?你尝试了什么?如果你有错误,那么一定有一些查询抛出了这些错误,请将此查询附加到问题。对不起,兄弟,我使用的查询只是分组一天..不知道如何加入并使用行作为列你可以提供吗e一个完整的解决方案,解释得很好,优化得很好的解决方案…解释得很好,优化得很好的解决方案…再次检查输出交叉连接适用于所有4列,这就是为什么值变为4倍(总和):)再次检查输出交叉连接适用于所有4列,这就是为什么该值变为4倍(总和):)
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;