首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在MySQL上构建按统计信息检索组的SQL查询

如何在MySQL上构建按统计信息检索组的SQL查询
EN

Stack Overflow用户
提问于 2012-06-04 01:45:17
回答 1查看 56关注 0票数 0

我有两张桌子,一张和一张,每一张都有很多张。

代码语言:javascript
运行
复制
series: seriesID, seriesName...
cards: cardID, seriesID, cardActive (bit), cardUsed(bit)

我想返回以下查询:

  • 每个系列有多少张卡片?
  • 每个系列有多少张非活动卡?
  • 每个系列有多少张用过的卡片?
  • 每个系列有多少未使用的和活跃的卡片?

F 210

目标是有一个具有以下标题的表:

代码语言:javascript
运行
复制
seriesID | seriesName | total cards count | inactive cards | etc..

我试过用这个:

代码语言:javascript
运行
复制
SELECT seriesID,COUNT(*) AS cardsCount FROM cards GROUP BY seriesID

但我不知道是否需要5个不同的查询才能获得指定的统计数据。我应该使用函数吗?

EN

Stack Overflow用户

回答已采纳

发布于 2012-06-04 02:37:22

您可能可以将位字段之和(除非这会产生奇偶值而不是整数),大小写表达式有助于最后一个:

代码语言:javascript
运行
复制
 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)表达式有可能做不到我想做的事情。在这种情况下:

代码语言:javascript
运行
复制
       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)只计算非空值,因此当系列没有卡片时,这将给出零。

代码语言:javascript
运行
复制
 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;
票数 1
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10875490

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档