2011-04-08 113 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