Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/url/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在MySQL上构建一个SQL查询来检索分组统计信息_Mysql_Sql - Fatal编程技术网

如何在MySQL上构建一个SQL查询来检索分组统计信息

如何在MySQL上构建一个SQL查询来检索分组统计信息,mysql,sql,Mysql,Sql,我有两张桌子,系列和卡片(一对多:每个系列有许多卡片) 我想返回以下内容的查询: 每个系列总共有多少张卡片 每个系列有多少张非活动卡 每个系列有多少张二手卡 每个系列有多少张未使用的卡和活动卡 目标是创建一个具有以下标题的表: seriesID | seriesName | total cards count | inactive cards | etc.. 我试过用这个: SELECT seriesID,COUNT(*) AS cardsCount FROM cards GROUP BY

我有两张桌子,系列和卡片(一对多:每个系列有许多卡片)

我想返回以下内容的查询:

  • 每个系列总共有多少张卡片
  • 每个系列有多少张非活动卡
  • 每个系列有多少张二手卡
  • 每个系列有多少张未使用的卡和活动卡
目标是创建一个具有以下标题的表:

seriesID | seriesName | total cards count | inactive cards | etc..
我试过用这个:

SELECT seriesID,COUNT(*) AS cardsCount FROM cards GROUP BY seriesID
但是我想知道我是否需要5个不同的查询来获得指定的统计数据。
我应该使用函数吗

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

 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,您可以从groupby中省略
s.SeriesName
,您可能会得到相同的答案;大多数其他DBMS都要求GROUPBY子句中的两个非聚合列

有可能
SUM(非c.CardActive)
SUMN(非c.cardaused)
表达式不能满足我的要求。在这种情况下:

       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",
我会成功的

对于至少列出了一张卡的系列而言,这些都是干净的。如果您的序列中没有卡片,并且希望在输出中使用它们,那么您需要表之间的左外联接,并且您必须担心空值。这一次,整个过程都需要
总和(CASE…END)
。请注意,
COUNT(C.cardd)
只对非空值进行计数,因此当序列没有卡时,这将为零

 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;

好的,我明白了。我添加了我的第一种方法。
 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;