一个查询中的两个计数与相反的 where 条件

Two counts in one query with opposing where criteria

我有两个单独的查询,它们本身运行良好,但我需要它们在一个查询中运行。我可以在 excel 中轻松组合结果,但这将成为更大查询的一部分。

两个单独的查询是:

SELECT 
    SiteProductVariation.ProductVariationID, 
    COUNT(SiteProduct.SiteProductID) AS Expr1
FROM 
    SiteProductVariation 
INNER JOIN 
    SiteProduct ON SiteProduct.SiteProductID = SiteProductVariation.SiteProductID
WHERE 
    (SiteProductVariation.ProductVariationID = 159868) 
    AND (SiteProduct.ProductDisplay = 0)
GROUP BY 
    SiteProductVariation.ProductVariationID

SELECT 
    SiteProductVariation.ProductVariationID, 
    COUNT(SiteProduct.SiteProductID) AS Expr1
FROM 
    SiteProductVariation 
INNER JOIN 
    SiteProduct ON SiteProduct.SiteProductID = SiteProductVariation.SiteProductID
WHERE 
    (SiteProductVariation.ProductVariationID = 159868) 
    AND (SiteProduct.ProductDisplay = 1)
GROUP BY 
    SiteProductVariation.ProductVariationID

为此 ProductVariationID 有 11 个 Siteproductid,其中 7 个具有 Productdisplay=1,4 个具有 ProductDisplay=0,这些查询 return 该信息很好。

但我尝试将它们组合成:

SELECT 
    SiteProductVariation.ProductVariationID, 
    COUNT(SiteProduct.SiteProductID) AS Expr1, 
    COUNT(SiteProduct_1.SiteProductID) AS Expr2
FROM 
    SiteProductVariation 
INNER JOIN 
    SiteProduct ON SiteProduct.SiteProductID = SiteProductVariation.SiteProductID 
INNER JOIN 
    SiteProduct AS SiteProduct_1 ON SiteProduct_1.SiteProductID = SiteProductVariation.SiteProductID
WHERE 
    (SiteProductVariation.ProductVariationID = 159868) 
    AND (SiteProduct.ProductDisplay = 0) 
    AND (SiteProduct_1.ProductDisplay = 1)
GROUP BY 
    SiteProductVariation.ProductVariationID

没有得到任何结果。我想是因为我查这个问题的时候用了group by。

任何帮助,即使说我做不到,也将不胜感激。 siteproductid 可能有 0 个结果,ProductDisplay 等于 1 或 0,因此可能需要考虑到这一点。提前致谢。

修改第一个版本使用IN。此外,使用 table 别名简化查询:

SELECT spv.ProductVariationID, COUNT(sp.SiteProductID) AS Expr1
FROM SiteProductVariation spv INNER JOIN
     SiteProduct sp
     ON sp.SiteProductID = spv.SiteProductID
WHERE (spv.ProductVariationID = 159868) AND
      (sp.ProductDisplay IN (0, 1))
GROUP BY spv.ProductVariationID;

注意:您的版本可以在 ProductDisplay 的两个条件之间使用 OR 而不是 AND

如果您希望将 ProductDisplay 值分开的结果,请将其包含在 SELECTGROUP BY:

SELECT spv.ProductVariationID, sp.ProductDisplay,
       COUNT(sp.SiteProductID) AS Expr1
FROM SiteProductVariation spv INNER JOIN
     SiteProduct sp
     ON sp.SiteProductID = spv.SiteProductID
WHERE (spv.ProductVariationID = 159868) AND
      (sp.ProductDisplay IN (0, 1))
GROUP BY spv.ProductVariationID, sp.ProductDisplay;

您在查询中使用了 AND 子句,这是根本原因。请改用 OR ,因为您希望满足其中一个条件而不是同时满足。语句应该是((SiteProduct.ProductDisplay = 0) OR (SiteProduct_1.ProductDisplay = 1)),因为值可以同时是0 or 1not 0 and 1

所以查询变为:

SELECT     SiteProductVariation.ProductVariationID, COUNT(SiteProduct.SiteProductID) AS Expr1, COUNT(SiteProduct_1.SiteProductID) AS Expr2
FROM         SiteProductVariation INNER JOIN
                      SiteProduct ON SiteProduct.SiteProductID = SiteProductVariation.SiteProductID INNER JOIN
                      SiteProduct AS SiteProduct_1 ON SiteProduct_1.SiteProductID = SiteProductVariation.SiteProductID
WHERE     (SiteProductVariation.ProductVariationID = 159868) AND ((SiteProduct.ProductDisplay = 0) OR (SiteProduct_1.ProductDisplay = 1))
GROUP BY SiteProductVariation.ProductVariationID  

您可以尝试使用 UNION 子句。

SELECT SiteProductVariation.ProductVariationID, 
COUNT(SiteProduct.SiteProductID) AS Expr1
FROM  SiteProductVariation 
INNER JOIN SiteProduct 
ON SiteProduct.SiteProductID = SiteProductVariation.SiteProductID
WHERE (SiteProductVariation.ProductVariationID = 159868) 
AND (SiteProduct.ProductDisplay = 0)
GROUP BY SiteProductVariation.ProductVariationID
UNION
SELECT SiteProductVariation.ProductVariationID, COUNT(SiteProduct.SiteProductID) AS Expr1
FROM SiteProductVariation INNER JOIN
SiteProduct ON SiteProduct.SiteProductID = SiteProductVariation.SiteProductID
WHERE     (SiteProductVariation.ProductVariationID = 159868) AND (SiteProduct.ProductDisplay = 1)
GROUP BY SiteProductVariation.ProductVariationID

您可以使用 UNION.

包含两个查询的结果

如果您只想 return 不同的(即非重复的)行,那么只需单独使用 UNION。如果您想要两个查询中的所有行,请改用 UNION ALL

SELECT     SiteProductVariation.ProductVariationID, COUNT(SiteProduct.SiteProductID) AS Expr1
FROM         SiteProductVariation INNER JOIN
                      SiteProduct ON SiteProduct.SiteProductID = SiteProductVariation.SiteProductID
WHERE     (SiteProductVariation.ProductVariationID = 159868) AND (SiteProduct.ProductDisplay = 1)
GROUP BY SiteProductVariation.ProductVariationID
UNION --Note you could use UNION ALL here if you want all rows returning
SELECT     SiteProductVariation.ProductVariationID, COUNT(SiteProduct.SiteProductID) AS Expr1, COUNT(SiteProduct_1.SiteProductID) AS Expr2
FROM         SiteProductVariation INNER JOIN
                      SiteProduct ON SiteProduct.SiteProductID = SiteProductVariation.SiteProductID INNER JOIN
                      SiteProduct AS SiteProduct_1 ON SiteProduct_1.SiteProductID = SiteProductVariation.SiteProductID
WHERE     (SiteProductVariation.ProductVariationID = 159868) AND (SiteProduct.ProductDisplay = 0) AND (SiteProduct_1.ProductDisplay = 1)
GROUP BY SiteProductVariation.ProductVariationID

你可以这样做:

SELECT     SiteProductVariation.ProductVariationID, 
SUM(CASE WHEN SiteProduct.ProductDisplay = 0 THEN 1 ELSE 0 END) AS Expr1,
SUM(CASE WHEN SiteProduct.ProductDisplay = 1 THEN 1 ELSE 0 END) AS Expr2
FROM         SiteProductVariation INNER JOIN
                      SiteProduct ON SiteProduct.SiteProductID = SiteProductVariation.SiteProductID
WHERE     (SiteProductVariation.ProductVariationID = 159868) AND (SiteProduct.ProductDisplay IN (0,1))
GROUP BY SiteProductVariation.ProductVariationID
SELECT     SiteProductVariation.ProductVariationID
         , COUNT(CASE WHEN SiteProduct.ProductDisplay = 0 THEN  SiteProduct.SiteProductID END) AS Expr1
         , COUNT(CASE WHEN SiteProduct.ProductDisplay = 1 THEN  SiteProduct.SiteProductID END) AS Expr2
FROM SiteProductVariation 
INNER JOIN SiteProduct ON SiteProduct.SiteProductID = SiteProductVariation.SiteProductID 
WHERE (SiteProductVariation.ProductVariationID = 159868) 
  AND (SiteProduct.ProductDisplay = 0 
       OR 
      SiteProduct.ProductDisplay = 1)
GROUP BY SiteProductVariation.ProductVariationID