如何根据出现多次的月份获取日期?

时间:2019-05-08 20:08:41

标签: sql ssms-2017

我试图获得至少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|

4 个答案:

答案 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;