2011-04-08 24 views
1
CREATE TABLE #t(LocationCode varchar(10), ResourceId int, TransType char(3)) 

INSERT #t 
SELECT 'STORE 001', 1, 'In' UNION ALL 

SELECT 'STORE 002', 2, 'In' UNION ALL 

SELECT 'STORE 003', 3, 'In' UNION ALL 

SELECT 'STORE 001', 1, 'Out' UNION ALL 
SELECT 'STORE 004', 1, 'In' UNION ALL 

SELECT 'STORE 004', 4, 'In' UNION ALL 
SELECT 'STORE 004', 4, 'Out' UNION ALL 

SELECT 'STORE 004', 1, 'Out' UNION ALL 
SELECT 'STORE 001', 1, 'In' 

DROP TABLE #t 

如何僅顯示與「Out」(對不起我的英語不好)相比,最大數量爲「Ins」的相應位置的項目。T-SQL,忽略不需要的結果

LocationCode    ResourceId 
STORE 001[edited]   1 
STORE 002     2 
STORE 003     3 
+3

你說的意思是什麼換句話說,你能否澄清你是如何達到預期的結果集的? – 2011-04-08 19:31:55

+1

對不起,這是模棱兩可的,我的壞。我將編輯該問題。謝謝。 – 2011-04-08 19:33:46

+1

有問題,可以重複排?例如, 'STORE 001',1,'In',這是因爲再次被接納爲資源。 – Longha 2011-04-08 19:55:49

回答

6

假設你只希望Ins沒有匹配的輸出。

SELECT * 
FROM #t AS a 
WHERE a.TransType = 'In' 
    AND NOT EXISTS (
     SELECT * 
     FROM #t AS b 
     WHERE b.TransType = 'Out' 
      AND b.LocationCode = a.LocationCode 
      AND b.ResourceId = a.ResourceId 
    ) 

在模式中需要更多的數據才能夠按時間匹配Out和In。

嘗試簡單的東西是這樣的:

SELECT LocationCode, ResourceID 
FROM #t 
GROUP BY LocationCode, ResourceID 
HAVING COUNT(*) % 2 = 1 

這裏的地方事務進行了測序,並使用該序列兩種方式一個例子:「最近的位置」

CREATE TABLE #t(LocationCode varchar(10), ResourceId int, TransType char(3), Seq int UNIQUE NOT NULL) 

INSERT #t 
SELECT 'STORE 001', 1, 'In', 1 UNION ALL 
SELECT 'STORE 002', 2, 'In', 2 UNION ALL 
SELECT 'STORE 003', 3, 'In', 3 UNION ALL 
SELECT 'STORE 001', 1, 'Out', 4 UNION ALL 
SELECT 'STORE 004', 1, 'In', 5 UNION ALL 
SELECT 'STORE 004', 4, 'In', 6 UNION ALL 
SELECT 'STORE 004', 4, 'Out', 7 UNION ALL 
SELECT 'STORE 004', 1, 'Out', 8 UNION ALL 
SELECT 'STORE 001', 1, 'In', 9 

;WITH Ins AS (
SELECT * FROM #t 
WHERE TransType = 'In' 
) 
,Outs AS (
SELECT * FROM #t 
WHERE TransType = 'Out' 
) 
,Matched AS (
SELECT *, 
(SELECT MIN(Seq) 
FROM Outs 
WHERE Outs.LocationCode = Ins.LocationCode 
AND Outs.ResourceID = Ins.ResourceID 
AND Outs.Seq > Ins.Seq) AS OutSeq 
FROM Ins 
) 
SELECT * 
FROM Matched 
WHERE OutSeq IS NULL 

;WITH LastIn AS (
SELECT ResourceID, MAX(Seq) AS Seq 
FROM #t 
WHERE TransType = 'In' 
GROUP BY ResourceID 
) 
SELECT * 
FROM LastIn 
WHERE NOT EXISTS (
SELECT * 
FROM #t outs 
WHERE outs.TransType = 'Out' 
AND Outs.ResourceID = LastIn.ResourceID 
AND outs.Seq > LastIn.Seq) 

DROP TABLE #t​​​​​​​​​​​ 
+1

+1閱讀各行之間的好工作。 – 2011-04-08 19:38:50

+1

+1需要更多數據才能與時間匹配的好點 – 2011-04-08 19:40:25

+0

感謝cade尋求答案。但是,這並不能解決問題。我正在編輯這個問題以使其更清楚。對不起我的英文不好 – 2011-04-08 19:55:15