删除一些列后的mysql组

时间:2016-01-18 09:27:10

标签: mysql sql

我有一个包含3个相关列的mysql表。

column1    column2   column3    
  12          NULL      13      
  12          stuff     14      
  13          stuff2    15      
  13          NULL      14      
  14          stuff2    15      
  14          NULL      16

我想运行一个sql查询,它给出了按column1分组的行数,其中column2为null而column3不是14.所以查询应返回类似这样的内容 -

14 1
12 1

它不会返回column1为13的任何行,因为对于column1为13的行,column3为14。

注意:我不想为此使用视图。

1 个答案:

答案 0 :(得分:3)

使用条件聚合:

SELECT column1, SUM(column2 IS NULL AND column3 <> 14) AS total
FROM table_name
GROUP BY column1
HAVING total > 0;

LiveDemo*

* SQLFiddle没有响应所以SQL Server等效

输出:

╔═════════╦═══════╗
║ column1 ║ total ║
╠═════════╬═══════╣
║      14 ║     1 ║
║      12 ║     1 ║
╚═════════╩═══════╝

工作原理:

  1. 条件true为1,false为0
  2. 每组
  3. SUM(第1列)
  4. HAVING total > 0过滤掉13

    
    ╔═════════╦═════════╦═════════╦═════════════╗
    ║ column1 ║ column2 ║ column3 ║  condition  ║
    ╠═════════╬═════════╬═════════╬═════════════╣
    ║      12 ║ NULL    ║      13 ║ true        ║
    ║      12 ║ stuff   ║      14 ║ false       ║
    ║      13 ║ stuff2  ║      15 ║ false       ║
    ║      13 ║ NULL    ║      14 ║ false       ║
    ║      14 ║ stuff2  ║      15 ║ true        ║
    ║      14 ║ NULL    ║      16 ║ false       ║
    ╚═════════╩═════════╩═════════╩═════════════╝
    
  5. 它可以更简单(如果你想要消除0的组),只需:

    SELECT column1, COUNT(*) AS total
    FROM table_name
    WHERE column2 IS NULL 
      AND column3 <> 14
    GROUP BY column1
    

    还有一件事:

      

    column3不是14

    如果column3可以为空,则可能需要使用:

     WHERE column2 IS NULL 
       AND (column3 <> 14 OR column3 IS NULL)