2010-06-04 114 views
1

好的,我需要一个T-SQL这个专家。SQL查询选择计数= 0

我有一个名为PackageStoreEvents的表,它有一个packageid,storecode和一个eventcode字段。我想返回storecode 2406的packageid值,其中eventcode = 6的计数为0.

我该怎么做?

我被困在这一个。

感谢您的帮助

回答

6

这不是非常漂亮,但应该工作。您在连接条件中将连接留在同一个表中,包括事件代码,声明右表没有包含IS NULL的行,然后执行DISTINCT以避免将以其他方式返回的许多行。

SELECT DISTINCT p1.packageid 
FROM PackageStoreEvents p1 
     LEFT JOIN 
       PackageStoreEvents p2 
       ON p1.packageid = p2.packageid 
       AND p1.storecode = p2.storecode 
       AND p2.eventcode = 6 
WHERE p2.packageid IS NULL 
AND p1.storecode = 2406 
+0

这将工作,但它绝对不是最好的方法。 – Kenneth 2010-06-04 13:21:44

+0

+1作为低音长号演奏者 – 2010-06-04 13:22:25

+0

@Kenneth - 所以发布一个更好的。这是迄今为止唯一一个真正能够工作的人。 – 2010-06-04 13:24:36

-2

也许这?:

SELECT PackageID 
FROM PackageStoreEvents 
WHERE Storecode = 2406 and EventCode = 6 
GROUP BY PackageID 
HAVING COUNT(EventCode) = 0 
+0

你打败了我。唯一不同的是您返回的不必要的列。无论哪种方式,你都有我的投票。 – Kenneth 2010-06-04 13:21:12

+0

这不起作用。您的WHERE子句将强制此查询仅获取EventCode等于6的行。然后,您的HAVING将过滤掉所有这些行。 – 2010-06-04 13:23:45

+0

这不起作用。 WHERE和它们之间的HAVING将确保没有行被返回。 – 2010-06-04 13:23:58

1
SELECT packageid 
FROM 
PackageStoreEvents p1 
WHERE storecode = 2406 
AND NOT EXISTS (SELECT * FROM PackageStoreEvents p2 
       WHERE p1.packageid = p2.packageid 
       AND p1.storecode = p2.storecode 
       AND p2.eventcode = 6) 
2

假设我正确地理解这个问题,我会用的东西沿着这行:

-- PackageStoreEvents (packageid, storecode, eventcode) 

SELECT DISTINCT packageid 
    FROM PackageStoreEvents r 
WHERE storecode = 2406 
    AND NOT EXISTS (SELECT * 
         FROM PackageStoreEvents cnt 
        WHERE cnt.packageid = r.packageid 
         AND cnt.storecode = r.storecode 
         AND cnt.eventcode = 6) 
+0

LOL,我打字慢了一下,马丁打了我一分钟=) (但是,让人放心的是两个人来了与同样的解决方案..至少我不是唯一一个看起来愚蠢的结果是错误的= P) – deroby 2010-06-04 13:39:49

+1

Sjeezzz,我需要3个编辑才能把它弄好......(并没有看到双倍不,直到你指出它......感谢上帝这是星期五!) (我只敢_assume_它现在...) – deroby 2010-06-04 13:48:05

7

尝试:

select packageid 
from PackageStoreEvents 
where storecode = 2406 
group by packageid 
having sum(case eventcode when 6 then 1 else 0 end)=0; 

用于单遍查询。

+0

+1我喜欢这个解决方案。 (顺便说一句,我修正了它的代码格式) – 2010-06-04 15:03:44

+0

看起来对我来说是最有效的选择。 – 2010-06-04 15:04:55