在单个查询中选择有效的"重复条目"时却困难缠绕我的头。
在下面的示例中,重复的StockNo
可以存在跨越多个Date
。我想搜索StockNo
的重复条目,如果在Date
当前年度中至少找到1个StockNo
记录,那么我还需要选择可能在任何其他年度中存在的合作伙伴。这可能吗?
示例查询:
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&6因为他们俩都不属于本月。
希望这是有道理的。感谢您提供的任何帮助。
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
演示:
sqlfiddle
非常感谢您将我指向正确的方向。您的答案很接近,但它仍然只返回了本月的记录,最后我使用了以下查询:
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
这个人已经躲过我一段时间了。