SQL查询是不是尽管使用IFNULL返回NULL值(MySQL的)

问题描述 投票:2回答:3

我有一个测试台设置为这样:Table Rows setup

我的目标是尝试并获得当前部门以前设立该部门的计数。我的SQL是:

SELECT A.Department, IFNULL(COUNT(*), 0) 
FROM Departments A
INNER JOIN Departments B ON B.YearOfEstablishment < A.YearOfEstablishment
GROUP BY Department
ORDER BY COUNT(*);

但是我都试过LEFT JOININNER JOIN,这是第一次发现从未返回,因为我可以假设它是无效的最后一个部门。尽管有IFNULL,该部门未显示。

我在做什么错在这里?

mysql sql
3个回答
2
投票

我认为这是你需要的查询:

SELECT A.Department, COUNT(B.Department)
FROM Departments A
LEFT JOIN Departments B ON B.YearOfEstablishment < A.YearOfEstablishment
GROUP BY A.Department
ORDER BY 2;

this db fiddle demo

| Department        | cnt |
| ----------------- | --- |
| Office Management | 0   |
| Business          | 1   |
| Sales Management  | 2   |
| ComputerScience   | 3   |
| Liberal Arts      | 4   |
| Farming           | 4   |
| Communications    | 6   |
| Digital Science   | 7   |

注:如由@fifonik评论,并不需要IFNULL因为COUNT已经返回0时没有记录可用。


1
投票

在MySQL 8+,你可以更好地做到这一点使用rank()row_number()

SELECT d.Department,
       ROW_NUMBER() OVER (ORDER BY YearOfEstablishment) - 1 as seqnum
FROM Departments d
ORDER BY seqnum;

由于没有联系,这将是与您的查询。这可能是更好的事情可做:

SELECT d.Department,
       RANK() OVER (ORDER BY YearOfEstablishment) - 1 as seqnum
FROM Departments d
ORDER BY seqnum;

这应该是您正在寻找的计数。


-1
投票

你也可以做这样的事情:

SELECT
      A.Department
    , A.YearOfEstablishment
    , COUNT(*) - 1
FROM
    Departments A
    INNER JOIN Departments B ON (
           A.id = B.id
        OR B.YearOfEstablishment < A.YearOfEstablishment
    )
GROUP BY
    Department
ORDER BY
    COUNT(*);
© www.soinside.com 2019 - 2024. All rights reserved.