0

所以这是我很长的 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 和 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

因此,如果您认为您可以找到一种方法来帮助我缩短查询、提高查询效率等。我将永远感激不尽,并且能够在此过程中学到一些东西。谢谢!

4

2 回答 2

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;
于 2012-08-20T00:54:37.987 回答
0

也许您可以尝试使用与仅对 leader1<>'' 或 leader2<>'' (例如)所在的行求和的相同技巧,并添加您的级别和日期条件以执行此类操作

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` 
于 2012-08-20T03:19:06.003 回答