0

我正在尝试在至少 2 行中找到几个月的员工生日

我试图将生日信息表与自身联合起来,假设我可以遍历它们 abd 得到多次出现的月份 问题是:如何获得重复多次的月份的生日?

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

4 回答 4

0

分步考虑。

首先,我们将找到其中有多个生日的月份。这就是下面的子查询,我将其别名i为“内部查询”。(如果您想查看哪些月份符合条件,请替换MONTH(i.Birthdate)SELECT列表中。)1

然后,在外部查询(o)中,您想要所有字段,所以我在作弊并使用SELECT *. 从理论上讲,aWHERE IN可以在这里工作,但如果 a回来,IN可能会产生不幸的副作用,所以我从不使用它。NULL相反,有一个相关的 sub=query; 也就是说,我们查找外部查询的月份等于内部(相关子)查询中进行切割的月份的任何结果。

WHERE子句中使用相关子查询时,SELECT列表无关紧要。你可以放1/0,它不会抛出错误。但我总是SELECT 1用来表明内部查询实际上并没有向外部查询返回任何结果。它只是在那里寻找两个数据集之间的相关性。

SELECT
  *
FROM
  @table AS o
WHERE 
  EXISTS
    (
      SELECT
        1
      FROM
        @table AS i
      WHERE
        MONTH(i.Birthdate) = MONTH(o.Birthdate)
      GROUP BY 
        MONTH(i.Birthdate)
      HAVING
        COUNT(*) > 1
    );
于 2019-05-08T21:14:10.400 回答
0

这是另一种使用GROUP_CONCAT. 这不完全是您正在寻找的东西,但它可能会完成这项工作。不过,埃里克的方法更好。(注意:这是针对 MySQL 的)

SELECT GROUP_CONCAT(EmployeeID) EmployeeID, BirthDate, COUNT(*) DupeCount 
FROM Employees 
GROUP BY MONTH(BirthDate) 
HAVING DupeCount> 1;
于 2019-05-08T22:40:54.060 回答
0

似乎是一个奇怪的要求。

这可能有助于进行一些调整。在甲骨文中工作。

    SELECT DATE FROM TABLE WHERE EXTRACT(MONTH FROM DATE)=EXTRACT(MONTH FROM SOMEDATE);
于 2019-05-08T20:47:37.033 回答
0

试试这个,你也许可以省去你的 UNION:

SELECT 
   EmployeeId
 , City
 , BirthDate 
FROM Employees 
GROUP BY 
   EmployeeId
 , City
 , BirthDate 
HAVING COUNT(Month(BirthDate)) > 2
于 2019-05-08T21:00:48.943 回答