在单个查询中选择有效的“重复条目”时,无法绕过头脑。
在下面的示例中,可以存在多个StockNo
的重复Date
。我想在StockNo
中搜索重复的条目,如果在StockNo
当前的YEAR-MONTH中找到至少1条Date
条记录,那么我还需要选择其中可能存在的合作伙伴任何其他年份。这可能吗?
示例查询:
SELECT * FROM `sales`
WHERE `StockNo` IN
(SELECT `StockNo` FROM `sales` GROUP BY `StockNo` HAVING COUNT(*) > 1)
AND `Date` LIKE '2016-11-%'
ORDER BY `StockNo`, `TransactionID`;
示例数据:
ID | StockNo | Date
1 | 1 | 2016-11-01
2 | 1 | 2016-11-10
3 | 2 | 2016-11-05
4 | 2 | 2016-10-29
5 | 3 | 2016-10-25
6 | 3 | 2016-10-15
通过我的示例查询和数据,我有3对重复条目。很明显,由于AND Date LIKE '2016-11-%'
,我只返回3条记录(ID为1,2和3),但是我需要返回ID的1,2,3,4。我想忽略ID的5& 3。 6因为它们都不属于当月。
希望这是有道理的。感谢您提供的任何帮助。
答案 0 :(得分:2)
SELECT StockNo
FROM sales
GROUP BY StockNo
HAVING SUM(CASE WHEN DATE_FORMAT(Date, '%Y-%m') = '2016-11' THEN 1 ELSE 0 END) > 0
如果您还想在上述查询中检索匹配库存号的完整记录,您只需添加一个联接:
SELECT s1.*
FROM sales s1
INNER JOIN
(
SELECT StockNo
FROM sales
GROUP BY StockNo
HAVING SUM(CASE WHEN DATE_FORMAT(Date, '%Y-%m') = '2016-11' THEN 1 ELSE 0 END) > 0
) s2
ON s1.StockNo = s2.StockNo
在这里演示:
答案 1 :(得分:0)
非常感谢蒂姆指出我正确的方向。你的答案很接近,但它仍然只返回当月的记录,最后我使用了以下查询:
SELECT s1.* FROM `sales` s1
INNER JOIN
(
SELECT * FROM `sales` GROUP BY `StockNo` HAVING COUNT(`StockNo`) > 1
AND SUM(CASE WHEN DATE_FORMAT(`Date`, '%Y-%m')='2016-11' THEN 1 ELSE 0 END) > 0
) s2
ON s1.StockNo=s2.StockNo
这个人已经躲过了我一段时间。