1

我正在尝试在 SQLite DB 中构建一个支持条件分组的查询。

这是我到目前为止所尝试的:

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"
4

2 回答 2

1

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
于 2018-06-09T05:39:21.380 回答
1

我对汇总数据持谨慎态度,因为结果位于多行且总数与原始数据不匹配。当然,有时它是必要的,但这里有两种选择。

如果您的结果可以稍微灵活一些,那么您可以将条件连接在一起以获得更复杂的组:

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得到一串 0 和 1 表示组。

这些结果您的结果不同。如果我查看不同的组,它们是我想要的更多——我希望看到组之间的重叠。

或者,我会将值放在单独的列中:

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;

这些是相同的结果,但转向不同。

于 2018-06-09T11:38:12.893 回答