一个查询中的两个计数与相反的 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
值分开的结果,请将其包含在 SELECT
和 GROUP 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 1
和not 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
我有两个单独的查询,它们本身运行良好,但我需要它们在一个查询中运行。我可以在 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
值分开的结果,请将其包含在 SELECT
和 GROUP 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 1
和not 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