代码之家  ›  专栏  ›  技术社区  ›  Abhishek Ginani

从条件group by返回多行,不带并集

  •  1
  • Abhishek Ginani  · 技术社区  · 6 年前

    我正在尝试在sqlite db中构建一个支持条件group by的查询。

    以下是我迄今为止所做的尝试:

    SELECT 
          case 
           when A>1 AND B>1 THEN 1
           when X>1 AND Y>1 THEN 2
           when C>1 AND D>1 THEN 3
          END AS data_grp,
         SUM(col1) AS col1,
         SUM(col2) AS col2
    FROM tbl
    GROUP BY data_grp;
    

    如果一次只有一个案例是正确的,那么这就非常有效。如果一行中有多个事例为真,则返回第一个事例,而不是所有令人满意的组。

    我试过这个 union 它工作得很好,但速度很慢。有没有其他方法可以用这个条件组快速获取结果。

    示例数据和预期结果:

    DROP TABLE IF EXISTS  tbl;
    CREATE TABLE tbl
    (
        A INT,
        B INT,
        C INT,
        D INT,
        X INT,
        Y INT,
        col1 int,
        col2 int
    
    );
    
    INSERT INTO tbl(A,B,C,D,X,Y,col1,col2) values (2,3,0,0,0,0,5,10);
    INSERT INTO tbl(A,B,C,D,X,Y,col1,col2) values (0,0,0,0,8,10,3,2);
    INSERT INTO tbl(A,B,C,D,X,Y,col1,col2) values (5,4,4,9,0,0,3,2);
    
        SELECT 
              case 
               when A>1 AND B>1 THEN 1
               when X>1 AND Y>1 THEN 2
               when C>1 AND D>1 THEN 3
              END AS data_grp,
             SUM(col1) AS col1,
             SUM(col2) AS col2
        FROM tbl
        GROUP BY data_grp;
    

    查询输出:

    "1" "8" "12"
    "2" "3" "2"
    

    预期输出:

    "1" "8" "12"
    "2" "3" "2"
    "3" "3" "2"
    
    2 回复  |  直到 6 年前
        1
  •  1
  •   Peeyush    6 年前

    GROUP BY

    WITH RECURSIVE
      cnt(x) AS (
         SELECT 1
         UNION ALL
         SELECT x+1 FROM cnt
          LIMIT 3
      )
    SELECT x as data_grp, sum(col1), sum(col2)
    FROM cnt, 
          (SELECT 
              case when A>1 AND B>1 THEN 1  ELSE 0 END as dg1,
              case when X>1 AND Y>1 THEN 2 ELSE 0 END as dg2,
              case when C>1 AND D>1 THEN 3 ELSE 0 END as dg3,
              col1, col2
            FROM tbl) t WHERE x=dg1 or x=dg2 or x=dg3
    GROUP BY x
    
        2
  •  1
  •   Gordon Linoff    6 年前

    SELECT ( (CASE WHEN A > 1 AND B > 1 THEN '1' ELSE '' END) ||
             (CASE WHEN X > 1 AND Y > 1 THEN '2' ELSE '' END) ||
             (CASE WHEN C > 1 AND D > 1 THEN '3' ELSE '' END)
           ) AS data_grp,
           SUM(col1) AS col1, SUM(col2) AS col2
    FROM tbl
    GROUP BY data_grp;
    

    SELECT ( (CASE WHEN A > 1 AND B > 1 THEN '1' ELSE '0' END) ||
             (CASE WHEN X > 1 AND Y > 1 THEN '1' ELSE '0' END) ||
             (CASE WHEN C > 1 AND D > 1 THEN '1' ELSE '0' END)
           ) AS data_grp,
    

    data_grp

    SELECT SUM(CASE WHEN A > 1 AND B > 1 THEN col1 ELSE 0 END) as sum1_1,
           SUM(CASE WHEN X > 1 AND Y > 1 THEN col1 ELSE 0 END) as sum1_2,
           SUM(CASE WHEN C > 1 AND D > 1 THEN col1 ELSE 0 END) as sum1_3,
           SUM(CASE WHEN A > 1 AND B > 1 THEN col2 ELSE 0 END) as sum2_1,
           SUM(CASE WHEN X > 1 AND Y > 1 THEN col2 ELSE 0 END) as sum2_2,
           SUM(CASE WHEN C > 1 AND D > 1 THEN col2 ELSE 0 END) as sum2_3
    FROM tbl;