【问题标题】:Combining multiple queries into one query in SQL在 SQL 中将多个查询组合成一个查询
【发布时间】:2018-07-15 12:45:42
【问题描述】:

我在 sql 中遇到了一个问题,因为我对此很陌生。

我有三个查询

select count(*) as range1_50to60 from Customers where age between 50 and 60;

select count(*) as range2_30to40 from Customers where age between 30 and 40;

select count(*) as range3_20to30 from Customers where age between 20 and 30;

有什么方法可以将这些查询组合成一个查询。

问候

萨米拉

【问题讨论】:

标签: mysql sql


【解决方案1】:

使用case表达式进行条件聚合:

select count(case when age between 50 and 60 then 1 end) as range1_50to60,
       count(case when age between 30 and 40 then 1 end) as range2_30to40,
       count(case when age between 20 and 30 then 1 end) as range3_20to30
from Customers

where age between 20 and 60

WHERE 子句并不是真正需要的,但可以加快速度!

【讨论】:

    【解决方案2】:

    你可以像这样使用SUM

    SELECT SUM(IF(age between 50 and 60,1,0)) AS range1_50to60, 
           SUM(IF(age between 30 and 40,1,0)) AS range1_30to40, 
           SUM(IF(age between 20 and 30,1,0)) AS range1_20to30 
    FROM Customers
    

    【讨论】:

      【解决方案3】:

      您可以尝试使用 UNION ALL 连接所有查询,它会像这样结束。

      select count(*) as result from Customers where age between 50 and 60
      union all
      select count(*) as result from Customers where age between 30 and 40;
      union all
      select count(*) as result from Customers where age between 20 and 30;
      

      结果将是:

      row[0] for range1_50to60
      row[1] for range2_30to40 
      row[2] for range3_20to30
      

      【讨论】:

        【解决方案4】:

        首先我们有我们的虚拟数据

        CREATE TABLE persons(
            person_id NUMBER GENERATED BY DEFAULT AS IDENTITY,
            first_name VARCHAR2(50) NOT NULL,
            last_name VARCHAR2(50) NOT NULL,
            age NUMBER,
            PRIMARY KEY(person_id)
        );
        insert all 
            into persons(person_id,first_name,last_name,age) values(1,'jose','alvarez',32)
            into persons(person_id,first_name,last_name,age) values(2,'karla','romagnoli',24)
            into persons(person_id,first_name,last_name,age) values(3,'daniela','alcazar',24)
            into persons(person_id,first_name,last_name,age) values(4,'jaime','camilo',44)
            into persons(person_id,first_name,last_name,age) values(5,'jenifer','paola',22)
            into persons(person_id,first_name,last_name,age) values(6,'camila','puertas',55)
            into persons(person_id,first_name,last_name,age) values(7,'raul','duelas',30)
            into persons(person_id,first_name,last_name,age) values(8,'alejandra','bautizal',60)
            into persons(person_id,first_name,last_name,age) values(9,'domingo','cano',16)
            into persons(person_id,first_name,last_name,age) values(10,'felipe','vaca',25)
            into persons(person_id,first_name,last_name,age) values(11,'estefany','santes',28)
            into persons(person_id,first_name,last_name,age) values(12,'pamela','chu',55)
            into persons(person_id,first_name,last_name,age) values(13,'fernanda','zarate',67)
        select 1 from dual;
        

        由于您只需要一行数据,再加上这些最终结果彼此不相关这一事实,我们可以通过这种方式将它们与笛卡尔积集成:

        select 
        q1.total as age20_30,
        q2.total as age31_40,
        q3.total as age50_60
        from (
            select count(*) as total from persons p
            where p.age between 20 and 30
        ) q1, (
            select count(*) as total from persons p
            where p.age between 31 and 40
        ) q2, (
            select count(*) as total from persons p
            where p.age between 50 and 60
        ) q3 ;
        

        我们得到下一个结果

        age20_30 age31_40 age50_60
        6 1 3

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2017-09-02
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-10-08
          • 1970-01-01
          • 2014-01-16
          相关资源
          最近更新 更多