缩短SQL COUNT语句

时间:2012-08-19 22:44:12

标签: mysql sql join count

所以这是我非常长的SQL查询。

基本上,我有2个学级,JC1& JC2和我正在计算当前日期和上一个日期的每个级别的字段。

这是我今天的原始子查询,我使用另一个具有不同日期的子查询。

SELECT
level,
COUNT(studentid) AS total,
SUM(leader1 <> '' OR leader2 <> '') AS leaders,
SUM(scholarship <> '') AS scholarship,
SUM(pegasus <> '') as pegasus
FROM `laterec-students` 
WHERE latetime > '2012-05-25 00:00:00' 
GROUP BY level;

它会返回

level | total | leaders | scholarship |pegasus
  JC1 |  28   |    7    |      0      |   2
  JC2 |  14   |    6    |      0      |   3

现在有些日期,我可能没有JC1&amp; JC2被退回。 (例如。如上所述2012-05-25我得到了JC1和JC2,前一天,我只有JC2,因为没有JC1数据)

所以这就是为什么我没有使用JOIN来帮助我,或者因为我真的不知道如何正确使用JOIN。

对于我下面的SQL查询,

子查询返回此(子查询tjc1的示例)

total | leaders | scholarship |pegasus
 28   |    7    |      0      |   2


SELECT

SUM(tjc1.total) AS JC1total,
SUM(yjc1.ytotal) AS JC1ytotal,
SUM(tjc1.leaders) AS JC1leaders,
SUM(yjc1.yleaders) AS JC1yleaders,
SUM(tjc1.scholarship) AS JC1scholarship,
SUM(yjc1.yscholarship) AS JC1yscholarship,
SUM(tjc1.pegasus) AS JC1pegasus,
SUM(yjc1.ypegasus) AS JC1ypegasus,

SUM(tjc2.total) AS JC2total,
SUM(yjc2.ytotal) AS JC2ytotal,
SUM(tjc2.leaders) AS JC2leaders,
SUM(yjc2.yleaders) AS JC2yleaders,
SUM(tjc2.scholarship) AS JC2scholarship,
SUM(yjc2.yscholarship) AS JC2yscholarship,
SUM(tjc2.pegasus) AS JC2pegasus,
SUM(yjc2.ypegasus) AS JC2ypegasus

FROM

(
SELECT
COUNT(studentid) AS total,
SUM(leader1 <> '' OR leader2 <> '') AS leaders,
SUM(scholarship <> '') AS scholarship,
SUM(pegasus <> '') as pegasus
FROM `laterec-students` 
WHERE latetime > '2012-05-25 00:00:00' 
AND level = 'JC1'
) tjc1,
(
SELECT
COUNT(studentid) AS ytotal,
SUM(leader1<>'' or leader2<>'') AS yleaders,
SUM(scholarship<>'') AS yscholarship,
SUM(pegasus<>'') as ypegasus
FROM `laterec-students` 
WHERE latetime BETWEEN '2012-05-24 00:00:00' AND '2012-05-24 23:59:59'
AND level = 'JC1'
) yjc1,
(
SELECT
COUNT(studentid) AS total,
SUM(leader1 <> '' OR leader2 <> '') AS leaders,
SUM(scholarship <> '') AS scholarship,
SUM(pegasus <> '') as pegasus
FROM `laterec-students` 
WHERE latetime > '2012-05-25 00:00:00' 
AND level = 'JC2'
) tjc2,
(
SELECT
COUNT(studentid) AS ytotal,
SUM(leader1<>'' or leader2<>'') AS yleaders,
SUM(scholarship<>'') AS yscholarship,
SUM(pegasus<>'') as ypegasus
FROM `laterec-students` 
WHERE latetime BETWEEN '2012-05-24 00:00:00' AND '2012-05-24 23:59:59'
AND level = 'JC2'
) yjc2

因此,如果你认为你可以找到一种方法来帮助我缩短我的查询,使其更有效率等等。我将永远感激,并将能够沿途学习一些东西。谢谢!

2 个答案:

答案 0 :(得分:1)

试试这个:

select the_type, 
       level, 
       sum(total), 
       sum(leaders), 
       sum(scholarship), 
       sum(pegasus)

FROM
(
  (
  SELECT 
  't' the_type, 
  level,
  COUNT(studentid) AS total,
    SUM(leader1 <> '' OR leader2 <> '') AS leaders,
    SUM(scholarship <> '') AS scholarship,
    SUM(pegasus <> '') as pegasus
   FROM `laterec-students` 
  WHERE latetime > '2012-05-25 00:00:00' 
  AND level in('JC1', 'JC2')
  GROUP BY the_type, level
  ) 
UNION ALL
  (
  SELECT
   'y' the_type,
    level,
    COUNT(studentid) AS ytotal,
    SUM(leader1<>'' or leader2<>'') AS yleaders,
    SUM(scholarship<>'') AS yscholarship,
    SUM(pegasus<>'') as ypegasus
   FROM `laterec-students` 
  WHERE latetime BETWEEN '2012-05-24 00:00:00' AND '2012-05-24 23:59:59'
  AND level in('JC1', 'JC2')
  GROUP BY the_type, level
  )
) AS the_union
GROUP BY the_type, level;

另一种方式可能是:

SELECT
date(latetime) the_date,
level,
COUNT(studentid) AS total,
SUM(leader1<>'' or leader2<>'') AS leaders,
SUM(scholarship<>'') AS scholarship,
SUM(pegasus<>'') as pegasus
FROM `laterec-students` 
WHERE latetime between '2012-05-24 00:00:00' AND '2012-05-25 23:59:59'
AND level in('JC1', 'JC2')
group by the_date, level;

答案 1 :(得分:0)

也许你可以尝试使用你曾经用过的相同技巧来仅仅对leader1&lt;&gt;''或者leader2&lt;&gt;''(例如)的行进行求和,并添加你的等级和日期条件来做这样的事情< / p>

SELECT
SUM(level = 'JC1' AND latetime > '2012-05-25 00:00:00' ) AS total_TJC1,
SUM(leader1 <> '' OR leader2 <> '' AND level = 'JC1' AND latetime > '2012-05-25 00:00:00') AS leaders_TJC1,
SUM(scholarship <> '' AND level = 'JC1' AND latetime > '2012-05-25 00:00:00' ) AS scholarship_TJC1,
SUM(pegasus <> '' AND level = 'JC1' AND latetime > '2012-05-25 00:00:00' ) as pegasus_TJC1
FROM `laterec-students`