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