2014-01-14 13 views
0

我有這個結構表中的SQL Server:查找具有一個共同的現場記錄,但不同的值等領域

Promotions 
====== 
id 
promoId 
customerId 
dealPeriod 
lob 

我需要找到的記錄組,其中promoId的記錄是相同,但customerId,dealPeriod或lob是不同的。

所以,我會提不起興趣返回此:

id promoId  customerId dealPeriod lob 
1  p00100   100   2013 PL 
2  p00100   100   2013 PL 
3  p00100   100   2013 PL 

但我會想與吊球不同的值返回該組:

id promoId  customerId dealPeriod lob 
1  p00101   100   2013 PL 
2  p00101   100   2013 PL 
3  p00101   100   2013 RT 

或者這組不同的客戶ID :

id promoId  customerId dealPeriod lob 
1  p00102   100   2013 PL 
2  p00102   200   2013 PL 
3  p00102   100   2013 PL 

或與不同的處理週期的這個組:

id promoId  customerId dealPeriod lob 
1  p00103   100   2013 PL 
2  p00103   200   2014 PL 
3  p00103   100   2013 PL 

以下是我的嘗試:

SELECT t1.id, t1.customerId, t1.promoId, t1.dealPeriod, t1.lob 
FROM promotion t1 
INNER JOIN promotion t2 ON t1.promoid = t2.promoid 
WHERE (t1.customernumber <> t2.customernumber) 
OR (t1.dealPeriod <> t2.dealPeriod) 
OR (t1.lob <> t2.lob) 

這將返回的記錄,包括那些我不想:

id promoId  customerId dealPeriod lob 
1  p00100   100   2013 PL 
2  p00100   100   2013 PL 
3  p00100   100   2013 PL 
4  p00101   102   2013 RT 
5  p00101   102   2013 RT 
6  p00101   102   2013 RT 
+0

問題要求c頌歌必須表現出最小的努力。請使用您的代碼更新您的問題,向我們展示您嘗試過的內容。 – Kermit

+1

用我的查詢更新。 –

回答

0

試試這個

SELECT DISTINCT p.* 
FROM Promotions p 
    JOIN Promotions q ON p.promoid = q.promoid AND p.id <> q.id 
WHERE (p.customerId <> q.customerId) 
    OR (p.dealPeriod <> q.dealPeriod) 
    OR (p.lob <> q.lob) 
+0

恐怕這不起作用。我正在返回組,但這些組包含PromoId,CustomerId,DealPeriod和Lob的相同值。這與我的嘗試非常相似,我正在努力弄清楚它爲什麼不起作用。 –

+0

你可以用第二,第三和第四輸出中的例子來解釋結果是否有除id之外的所有列的重複內容。 – user2989408

+0

我更新了我的問題以包含我的查詢結果。讓我知道你是否需要更進一步。 –

0
;With CTE 
AS 
(
    SELECT * , RN = ROW_NUMBER() OVER (PARTITION BY promoId ORDER BY promoId) 
    FROM Promotions 
) 
SELECT * 
FROM CTE 
+0

我得到這個錯誤「列'ID'被'CTE'多次指定。」 –

+0

@ChrisHardie請更新你的答案,並顯示你在做什麼? –

+0

我最近更新了它,讓我知道你是否需要更多信息。之前的開發人員使用promoId,customerId,DealPeriod和lob字段來強化「版本」的概念。我們現在有數據完整性問題,我需要找到「版本」已被污染的數據不好。如果我不清楚,請告訴我。 –

相關問題