我试图获得至少2行中有几个月的员工生日
我尝试将生日信息表与自身结合在一起,假设我可以遍历它们,并且获得几个月出现多次的机会 有一个问题:如何获得重复数月不止一次的生日?
SELECT DISTINCT e.EmployeeID, e.City, e.BirthDate
FROM Employees e
GROUP BY e.BirthDate, e.City, e.EmployeeID
HAVING COUNT(MONTH(b.BirthDate))=COUNT(MONTH(e.BirthDate))
UNION
SELECT DISTINCT b.EmployeeID, b.City, b.BirthDate
FROM Employees b
GROUP BY b.EmployeeID, b.BirthDate, b.City
HAVING ...
给定表:
| 1 | City1 | 1972-03-26|
| 2 | City2 | 1979-12-13|
| 3 | City3 | 1974-12-16|
| 4 | City3 | 1979-09-11|
预期结果:
| 2 | City2 |1979-12-13|
| 3 | City3 |1974-12-16|
答案 0 :(得分:0)
似乎是一个奇怪的要求。
这可能会有所帮助。在Oracle中工作。
SELECT DATE FROM TABLE WHERE EXTRACT(MONTH FROM DATE)=EXTRACT(MONTH FROM SOMEDATE);
答案 1 :(得分:0)
尝试一下,您可以省去UNION:
SELECT
EmployeeId
, City
, BirthDate
FROM Employees
GROUP BY
EmployeeId
, City
, BirthDate
HAVING COUNT(Month(BirthDate)) > 2
答案 2 :(得分:0)
分步思考。
首先,我们将查找其中有一个以上生日的月份。这是下面的子查询,我为“内部查询”别名为i
。 (如果您想查看符合条件的月份,请用MONTH(i.Birthdate)
替换为SELECT
的{{1}}列表。)
然后,在外部查询(1
)中,您需要所有字段,因此我在作弊并使用o
。从理论上讲,SELECT *
可以在这里工作,但是如果WHERE IN
返回,IN
可能会有不幸的副作用,所以我从不使用它。而是有一个相关的sub = query;也就是说,我们寻找外部查询的月份等于内部查询(相关子查询)中削减月份的所有结果。
在NULL
子句中使用相关子查询时,WHERE
列表无关紧要。您可以放SELECT
,它不会引发错误。但是我总是使用1/0
来表明内部查询实际上没有向外部查询返回任何结果。只是在这里寻找两个数据集之间的相关性。
SELECT 1
答案 3 :(得分:0)
这是使用GROUP_CONCAT
的另一种方法。它不是您要找的东西,但它可以完成您的工作。埃里克的方法虽然更好。 (注意:这是针对MySQL)
SELECT GROUP_CONCAT(EmployeeID) EmployeeID, BirthDate, COUNT(*) DupeCount
FROM Employees
GROUP BY MONTH(BirthDate)
HAVING DupeCount> 1;