我有两张桌子,一张和一张,每一张都有很多张。
series: seriesID, seriesName...
cards: cardID, seriesID, cardActive (bit), cardUsed(bit)我想返回以下查询:
F 210
目标是有一个具有以下标题的表:
seriesID | seriesName | total cards count | inactive cards | etc..我试过用这个:
SELECT seriesID,COUNT(*) AS cardsCount FROM cards GROUP BY seriesID但我不知道是否需要5个不同的查询才能获得指定的统计数据。我应该使用函数吗?
发布于 2012-06-04 02:37:22
您可能可以将位字段之和(除非这会产生奇偶值而不是整数),大小写表达式有助于最后一个:
SELECT s.SeriesID,
s.SeriesName,
COUNT(*) AS "Total Cards",
SUM(NOT c.CardActive) AS "Inactive Cards",
SUM(NOT c.CardUsed) AS "Unused Cards",
SUM(CASE WHEN c.CardActive AND NOT c.CardUsed THEN 1 ELSE 0 END)
AS "Active and Unused"
FROM Series AS s
JOIN Cards AS c ON s.SeriesID = c.SeriesID
GROUP BY s.SeriesID, s.SeriesName;考虑到它是MySQL,您可以省略组BY中的s.SeriesName,并且可能得到相同的答案;大多数其他DBMS将要求GROUP BY子句中的两个非聚合列。
SUM(NOT c.CardActive)和SUMN(NOT c.CardUsed)表达式有可能做不到我想做的事情。在这种情况下:
SUM(CASE WHEN c.CardActive THEN 0 ELSE 1 END) AS "Inactive Cards",
SUM(CASE WHEN c.CardUsed THEN 0 ELSE 1 END) AS "Unused Cards",会成功的。
这都是干净的系列,其中至少有一张卡列出。如果您有一个没有卡片的系列,并且希望它们出现在输出中,那么您需要在两个表之间设置一个左外部连接,并且您必须担心空值。这一次,整个过程都将需要SUM(CASE...END)。请注意,COUNT(C.CardID)只计算非空值,因此当系列没有卡片时,这将给出零。
SELECT s.SeriesID,
s.SeriesName,
COUNT(c.CardID) AS "Total Cards",
SUM(CASE WHEN c.CardID IS NULL THEN 0 WHEN c.CardActive THEN 0 ELSE 1 END)
AS "Inactive Cards",
SUM(CASE WHEN c.CardID IS NULL THEN 0 WHEN c.CardUsed THEN 0 ELSE 1 END)
AS "Unused Cards",
SUM(CASE WHEN c.CardID IS NULL THEN 0
WHEN c.CardActive AND NOT c.CardUsed THEN 1 ELSE 0
END) AS "Active and Unused"
FROM Series AS s
LEFT JOIN Cards AS c ON s.SeriesID = c.SeriesID
GROUP BY s.SeriesID, s.SeriesName;https://stackoverflow.com/questions/10875490
复制相似问题