我有一个测试台设置为这样: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 JOIN
和INNER JOIN
,这是第一次发现从未返回,因为我可以假设它是无效的最后一个部门。尽管有IFNULL
,该部门未显示。
我在做什么错在这里?
我认为这是你需要的查询:
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;
| 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
时没有记录可用。
在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;
这应该是您正在寻找的计数。
你也可以做这样的事情:
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(*);