我对SQL并不是特别熟悉,但是我的团队让我看看这一系列的sql语句,看看是否有可能将它减少到1或2.我看着它,我不相信,但我不太了解sql技巧的经验或知识。
所以所有的陈述都有相同的格式
select
id, count(*)
from
table
where
x_date between to_date(start_date) and to_date(end_date)
group by
id
其中x_date是唯一改变的东西。 (Start_date和end_date就是我在这里输入的内容,使其更具可读性)。总共有10个陈述,其中7个正是这种格式。
在3个不同的中,其中一个看起来像这样:
select
id, count(*)
from
table
where
x_date between to_date(start_date) and to_date(end_date)
and userid not like 'AUTOPEND'
group by
id
,另外2个看起来像这样:
select
id, count(*)
from
table
where
x_date between to_date(start_date) and to. _date(end_date)
group by
id, x_code
x_code在它们之间有所不同。
他们希望使用这些数据进行统计分析,但是他们坚持要手动使用查询并输入。我看到它的方式是我无法真正组合这些语句,因为它们都是在同一个字段中进行分组(除了最后2个),所以这一切都在结果中合并,使得结果对分析无用。
我是否正确地思考它,或者是否有某种方式可以像他们问的那样做?我可以使1或2个sql语句输出超过1个表吗?
哦,我差点忘了。我相信这是使用SQL开发人员的Oracle PL / SQL。答案 0 :(得分:0)
由于第一个和第二个示例是按相同的方式进行分组,因此您可以使用嵌套在聚合函数中的CASE
语句:
SELECT id, COUNT(*) ,
SUM( CASE WHEN userid not like 'AUTOPEND' THEN 1 ELSE 0 END) AS [NotAUTOPEND]
FROM table
WHERE x_date between to_date(start_date) and to_date(end_date)
GROUP BY id
答案 1 :(得分:0)
您正尝试在单个查询中获取具有不同分组集的多个聚合。这称为ROLLUP或CUBE。有几种方法可以解决您的特定问题,但扩展分组功能是适合该工作的正确工具。展望未来,它将更加可维护和更快。
http://www.oracle-base.com/articles/misc/rollup-cube-grouping-functions-and-grouping-sets.php