是否可以组合或减少这些sql语句?

时间:2013-11-20 16:30:52

标签: sql plsql group-by where

我对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。

2 个答案:

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