1

我在 SQL Fiddle有一个示例表。

CREATE TABLE my_table
(id INT NOT NULL AUTO_INCREMENT UNIQUE,
  Shot VARCHAR(4),
  sec varchar(5),
  lay VARCHAR(15) NOT NULL,
  lay_status VARCHAR(15) NOT NULL,
  blk VARCHAR(10) NOT NULL,
  blk_status VARCHAR(15) NOT NULL,
  pri VARCHAR(10) NOT NULL,
  pri_status VARCHAR(15) NOT NULL,
  ani VARCHAR(10) NOT NULL,
  ani_status VARCHAR(15) NOT NULL,
  status VARCHAR(5)
);

INSERT INTO my_table VALUES
(1,'SH01','3','1863','yes','1863','yes','P4645','yes','P4557','yes','Over'),
(2,'SH02','2.5','1863','yes','P4645','no','P4557','yes','1863','no','Over'),
(3,'SH03','0.5','P4645','yes','P4557','yes','1863','yes','1863','yes','WIP'),
(4,'SH04','1.25','1863','no','P4645','no','P4557','yes','1863','yes','RTK'),
(5,'SH05','1','1863','yes','1863','yes','P4645','yes','P4557','yes','WIP'),
(6,'SH06','6','P4557','yes','P4645','yes','P4645','yes','P4557','yes','WIP');

我使用下面的 SQL 来检索lay=1863. 并在秒数的底部得到总数。

但结果是错误的。谁能指导我。

SELECT 
  IFNULL(Shot,'TOTAL') AS Shot
  , sec
  , lay
FROM my_table
where lay='1863'
group by shot with rollup;

总的结果(对于 sec 列)应该是 7.75,现在显示为 1

SHOT    SEC     LAY
SH01    3       1863
SH02    2.5     1863
SH04    1.25    1863
SH05    1       1863
TOTAL   7.75    
4

7 回答 7

3

如您所愿,请使用此查询

SELECT 
  Shot
  , sum(sec)
FROM my_table
where lay='1863'
group by shot with rollup;

GROUP BY 子句允许使用 WITH ROLLUP 修饰符,该修饰符会导致将额外的行添加到摘要输出中。这些行代表更高级别(或超聚合)的汇总操作

参考http://dev.mysql.com/doc/refman/5.0/en/group-by-modifiers.html

于 2013-03-06T11:15:01.130 回答
2

问题是您使用的 aGROUP BY没有聚合函数。在您当前的查询中,您没有在要汇总的列sum()上使用该列。sec尝试使用:

SELECT 
  coalesce(Shot,'TOTAL') AS Shot
  , sum(sec) Sec
  , min(lay) lay
FROM my_table
where lay='1863'
group by shot with rollup;

请参阅SQL Fiddle with Demo

您当前的查询未执行任何聚合,因此最终汇总行不正确。

您会注意到我将lay列放在聚合函数中。这是因为大多数数据库产品不允许将选择列表中的列排除在聚合函数内部或包含在group by.

MySQL 允许这样做是因为GROUP BY.

来自 MySQL 文档:

MySQL 扩展了 GROUP BY 的使用,以便选择列表可以引用未在 GROUP BY 子句中命名的非聚合列。...您可以使用此功能通过避免不必要的列排序和分组来获得更好的性能。但是,这主要在每个未在 GROUP BY 中命名的非聚合列中的所有值对于每个组都相同时很有用。服务器可以从每个组中自由选择任何值,因此除非它们相同,否则选择的值是不确定的。此外,从每个组中选择值不会受到添加 ORDER BY 子句的影响。在选择了值之后对结果集进行排序,并且 ORDER BY 不会影响服务器选择的值。

编辑:如果要lay在最后一行的列中隐藏结果,则可以使用:

SELECT 
  coalesce(Shot,'TOTAL') AS Shot
  , sum(sec) Sec
  , case when shot is not null then min(lay) else '' end lay
FROM my_table
where lay='1863'
group by shot with rollup;

请参阅带有演示的 SQL Fiddle

于 2013-03-06T11:14:04.730 回答
1

尝试这个

  SELECT 
  IFNULL(Shot,'TOTAL') AS Shot
 , sum(sec) as sec
 , lay
 FROM my_table
 where lay='1863'
 group by shot with rollup;

在这里演示

编辑 您可能会考虑计算 TOTAL 中有多少行,因为总计也许您还会计算有多少字段。像那样

 SELECT 
 IFNULL(Shot,'TOTAL') AS Shot
 , sum(sec) as sec
 , if(Shot is null , count(*) , lay) lay
 FROM my_table
 where lay='1863'
 group by shot with rollup;

在这里演示

如果您想为空,只需替换count(*)''

于 2013-03-06T11:16:35.167 回答
1

对 TOTAL 行使用“lay”列看起来不正确。除了这里是 SQL,它会给你预期的结果:

SELECT Shot, sec, lay FROM my_table WHERE lay = '1863'
UNION
SELECT 'TOTAL' AS Shot, SUM(sec), '' AS lay FROM my_table WHERE lay = '1863';

此外,如果列“Shot”在表中是唯一的,例如,可以使用下一个查询:

SELECT t1.Shot, t1.sec, t2.lay FROM
    (
    SELECT IFNULL(Shot, 'TOTAL') AS Shot, SUM(sec) As sec
    FROM my_table
    WHERE lay = '1863'
    GROUP BY Shot WITH ROLLUP
    ) t1
LEFT JOIN my_table t2
ON(t1.Shot = t2.shot);

这是在任何情况下都可以使用的解决方案:

SELECT t1.Shot, t1.sec, t1.lay FROM
    (
    SELECT IFNULL(Shot, 'TOTAL') AS Shot, SUM(sec) as sec, lay
    FROM my_table
    WHERE lay = '1863'
    GROUP BY Shot, lay WITH ROLLUP
    ) t1
WHERE t1.lay IS NOT NULL OR t1.Shot = 'TOTAL';
于 2013-03-06T13:35:12.710 回答
1

GROUP BY 用于聚合,如果你想要秒的总和,你必须要求总和。

SELECT
    IFNULL(Shot,'TOTAL') AS Shot
    , sum(sec)
    , max(lay)
    FROM my_table
    WHERE lay='1863'
    GROUP BY shot WITH ROLLUP;

http://sqlfiddle.com/#!2/1f61b/49

于 2013-03-06T11:15:53.093 回答
1

以下是按聚合分组的 MySQL 内置函数列表

AVG() Return the average value of the argument
BIT_AND() Return bitwise and
BIT_OR()  Return bitwise or
BIT_XOR()(v4.1.1) Return bitwise xor
COUNT(DISTINCT)   Return the count of a number of different values
COUNT()   Return a count of the number of rows returned
GROUP_CONCAT()(v4.1)  Return a concatenated string
MAX() Return the maximum value
MIN() Return the minimum value
STD() Return the population standard deviation
STDDEV_POP()(v5.0.3)  Return the population standard deviation
STDDEV_SAMP()(v5.0.3) Return the sample standard deviation
STDDEV()  Return the population standard deviation
SUM() Return the sum
VAR_POP()(v5.0.3) Return the population standard variance
VAR_SAMP()(v5.0.3)    Return the sample variance
VARIANCE()(v4.1)  Return the population standard variance

我相信你想要 SUM()

尝试

SELECT 
IFNULL(Shot,'TOTAL') AS Shot
,SUM(sec) AS sec 
, lay
FROM my_table
where lay='1863'
group by shot with rollup;
于 2013-03-06T11:19:15.260 回答
0

尝试这个 ::

    SELECT     
    Shot,
 sec,
lay   
    FROM my_table
    where lay='1863' and Shot is not null
    group by shot with rollup

    UNION

    SELECT 
   'TOTAL' AS Shot,
 SUM(sec),
 lay
FROM my_table
 where lay='1863'
 group by shot with rollup
于 2013-03-06T11:14:37.937 回答