选择此id的计数总和不为0的所有行

时间:2016-03-09 15:56:42

标签: sql excel ms-access

我从excel查询访问数据库。我有一张类似这个的表:

id    Product    Count
1        A         0
1        B         5
3        C         0
2        A         0
2        B         0
2        C         5
3        A         6
3        B         5
3        C         7

我希望从中返回所有行(包括该产品的计数为0的行),其中此ID的计数总和不为0且产品为A或B.所以从上表中,我会得到:

id    Product    Count
1        A         0
1        B         5
3        A         6
3        B         5

以下查询给出了正确的输出,但速度很慢(从一个小的7k行数据库查询时花了差不多一分钟),所以我想知道是否有更有效的方法。

SELECT *
FROM [BD$] BD
WHERE (BD.Product='A' or BD.Product='B') 
AND BD.ID IN (
  SELECT BD.ID
  FROM [BD$] BD
  WHERE (Product='A' or Product='B') 
  GROUP BY BD.ID
  HAVING SUM(BD.Count)<>0)

3 个答案:

答案 0 :(得分:3)

在子查询中使用GROUP BY方法,在INNER JOIN表中使用[BD$]

SELECT BD2.*
FROM
    (
        SELECT BD1.ID
        FROM [BD$] AS BD1
        WHERE BD1.Product IN ('A','B') 
        GROUP BY BD1.ID
        HAVING SUM(BD1.Count) > 0
    ) AS sub
    INNER JOIN [BD$] AS BD2
    ON sub.ID = BD2.ID;

答案 1 :(得分:1)

IN()语句可以执行很多次,你可以尝试EXISTS():

SELECT * FROM [BD$] BD
WHERE BD.Product in('A','B') 
  AND EXISTS(SELECT 1 FROM [BD$] BD2
             WHERE BD.id = BD2.id 
             AND BD2.Product in('A','B') 
             AND BD2.Count > 0)

答案 2 :(得分:0)

如果您要查找id的计数总和不为零的记录,则至少有一个非唯一ID必须具有非零的计数。

SELECT *
  FROM [BD$] BD
  WHERE BD.Product IN ('A', 'B') 
  AND BD.ID IN (
    SELECT DISTINCT b.ID
      FROM [BD$] b
      WHERE b.Product IN ('A', 'B') 
        AND b.Count<>0
    )