【问题标题】:SELECT all rows where sum of count for this id is not 0选择此 id 的计数总和不为 0 的所有行
【发布时间】:2016-03-09 15:56:42
【问题描述】:

我正在从 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

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

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)

【问题讨论】:

  • 如果这真的是 T-SQL,我建议使用分区表。

标签: sql excel ms-access


【解决方案1】:

在子查询中使用您的 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;

【讨论】:

    【解决方案2】:

    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)
    

    【讨论】:

      【解决方案3】:

      如果您要查找 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
          )
      

      【讨论】:

        猜你喜欢
        • 2018-03-23
        • 1970-01-01
        • 2023-03-09
        • 2015-08-08
        • 2016-06-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多