写一个Sum查询的正确方法

时间:2014-10-14 05:22:11

标签: mysql sum

我试图找出下面的代码是否采用正确的格式来检索年度付款总额

select sum(payment)
select mem_type.mtype, member.name, payment.payment_amt
from mem_type, member, payment
where mem_type.mtype = member.mtype
and member.mem_id = payment.mem_id
group by mem_id
having payment.date > '2014-1-1' <'2014-12-31';

1 个答案:

答案 0 :(得分:0)

声明中存在一些问题。

关键字SELECT出现两次,并且它的有效方式无效。 (子查询或内联视图中需要SELECT关键字,否则,重复关键字SELECT无效。

HAVING子句中的谓词并不完全正确。 (MySQL可能会接受它作为有效的语法,但它没有做你想要做的事情。要返回特定年份中payment.date的行,我们通常会将其指定为谓词在WHERE子句中:

 WHERE payment.date >= '2014-01-01' 
   AND payment.date <  '2015-01-01'

另外,我建议你放弃连接操作的旧式逗号语法,改为使用JOIN关键字,并将连接谓词从WHERE子句重定位到ON子句。例如:

SELECT ...
  FROM member 
  JOIN mem_type
    ON mem_type.mtype  = member.mtype
  JOIN payment
    ON payment.mem_id = member.mem_id

很高兴看到您已经对所有列引用进行了限定。

不幸的是,它无法推荐将返回您正在寻找的结果集的语法。有太多未知数,我们只是在猜测。您需要返回的结果的示例,从哪些数据返回规范。


如果我不得不盲目&#34;猜测&#34;在一个满足模糊规范的查询中,不知道表,列,数据类型等。我的猜测是这样的:

SELECT m.mem_id
     , t.mtype
     , m.name
     , IFNULL(SUM(p.payment_amt),0) AS total_payments_2014
  FROM member m
  LEFT
  JOIN mem_type t
    ON t.mtype  = m.mtype
  LEFT
  JOIN payment p
    ON p.mem_id = m.mem_id
 WHERE p.date >= '2014-01-01'
   AND p.date <  '2014-01-01' + INTERVAL 1 YEAR
 GROUP BY m.mem_id 

这只是一个例子。这是以未提供的大量信息为前提的(例如,付款表中date列的数据类型是什么?我们是否要排除日期为1/1或12的付款/ 31?成员表中mem_id列是唯一的吗?mtype表中的mem_type列是唯一的,成员表中的mem_type列是否为NULL,我们是否希望所有返回的成员表中的行,或者只有那些在2014年付款的行等。支付表上的mem_id列是否可以为NULL,payment中是否包含我们想要包含的行但是#39; t与会员有关?等人