2016-11-30 48 views
3

在單個查詢中選擇有效的「重複條目」時,遇到了麻煩。使用選擇性日期標準搜索MySQL重複條目

在下面的示例中,重複StockNo可以跨多個Date存在。我想搜索StockNo重複的條目,並且如果在Date當前的YEAR-MONTH內至少找到1 StockNo記錄,那麼我還需要選擇可能存在於任何其他YEAR-MONTH中的夥伴。這可能嗎?

實例查詢:

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,因爲它們都不屬於當前月份。

希望是有道理的。感謝您的任何幫助,您可以提供。

+0

'我想忽略ID的5&6,因爲它們都不屬於當前月份......但是ID 4也不在當前月份中嗎?請向我們展示您的預期產出。 –

+0

期望的輸出應該是ID的1,2,3和4,因爲這些記錄具有「至少一個」記錄,其中日期LIKE'2016-11-%'。 – Stinkys

回答

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 

演示在這裏:

SQLFiddle

+0

非常感謝Tim爲我指出了正確的方向。你的答案仍然只返回本月的記錄,最後我使用了以下內容: – Stinkys

+0

@Stinkys對不起,'HAVING'子句應該是'> 0',而不是'> 1' ...我更新了我的答案並且它現在按預期工作。 –

0

非常感謝Tim爲我指出正確的方向。你的答案是接近,但它仍然只是從目前的月份返回的記錄,並在最後,我用下面的查詢:

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 

這一個已經躲過了我一段時間。

+0

'COUNT(StockNo')這個詞在我看來似乎在邏輯上是錯誤的,因爲它會排除一個發生在11月份的「StockNo」。你應該使用我給你的答案。 –

+0

如果我將調整後的代碼複製到我的測試數據庫,它會選擇每個記錄的日期「2016-11-%」。只要向HAVING子句添加「COUNT('StockNo')> 1 AND」,它就會精確選擇我期待看到的記錄。 – Stinkys

+0

它將GROUP BY作爲StockNo的基礎,並且至少有1個當前月份的日期。可以肯定的是,現在我的腦海裏已經有了意義。 謝謝你的幫助:) – Stinkys