函数SUM无法按预期工作

时间:2013-06-05 14:05:58

标签: mysql sql

我有两张桌子

Table devolucion

detalle_ticket_ticket_id         fecha
    20                        2013-06-04
    21                        2013-06-04
    23                        2013-06-04
    23                        2013-06-04
    23                        2013-06-04
    24                        2013-06-04
    24                        2013-06-04
    24                        2013-06-04

Table detalle_ticket

ticket_id     precio    iva   cantidad
   20          7.25      0       7.25
   21          20        0      20   
   23          12        0      12
   23          13        0      13
   23          14        0      14
   24          48.40     16     48.40
   24          18.50     16     18.50
   24          4.70      0       4.70

我想要做的是将列precio,iva,cantidad中的值相加,其中列ticket_id的值是相同的,我会更好地解释:

列ticket_id中的第一行是20,第二行是21,第三行是23,第四行是23所以第三行和第四行具有相同的值(23)然后我需要的是将各自的值相加从列precio(值12 + 13 = 25),iva(0 + 0 = 0),cantidad(12 + 13 = 25)等整个行,问题来自我的查询,这不是我的工作预期。它让我感到困惑。

到目前为止我尝试了什么

SELECT dt.ticket_id, SUM(dt.precio), SUM(iva), SUM(cantidad) 
FROM devolucion d INNER JOIN detalle_ticket dt 
ON d.detalle_ticket_ticket_id = dt.ticket_id 
WHERE DATE(d.fecha) = '2013-06-04'
GROUP BY dt.ticket_id;

我的(错误)查询抛出的内容:

ticket_id     precio    iva   cantidad
   20          7.25      0       7.25
   21          20        0      20   
   23          117       0      12
   24          214.80   16      48.40  

我的期望:

ticket_id     precio    iva   cantidad
   20          7.25      0       7.25
   21          20        0      20   
   23          39        0      39
   24          71.6     32      71.6 

我已经在sqlfiddle http://www.sqlfiddle.com/#!2/64367

中创建了它

提前谢谢。

2 个答案:

答案 0 :(得分:2)

您可以使用子查询获取sum表中每列的detalle_ticket,然后您将该子查询加入devolucion表。由于每个表中有多行,而您只加入ticket_id,因此可以使用以下内容:

SELECT distinct d.detalle_ticket_ticket_id, 
  dt.precio, 
  dt.iva, 
  dt.cantidad
FROM devolucion d 
INNER JOIN
(
  select ticket_id, 
    sum(precio) precio, 
    sum(iva) iva,
    sum(cantidad) cantidad
  from detalle_ticket
  group by ticket_id
) dt 
  ON d.detalle_ticket_ticket_id = dt.ticket_id 
WHERE DATE(d.fecha) = '2013-06-04';

SQL Fiddle with Demo。这给出了一个结果:

| DETALLE_TICKET_TICKET_ID | PRECIO | IVA | cantidad |
-----------------------------------------------------
|                       20 |   7.25 |   0 |  7.25    |
|                       21 |     20 |   0 |    20    |
|                       23 |     39 |   0 |    39    |
|                       24 |   71.6 |  32 |  71.6    |

答案 1 :(得分:1)

问题是两个表中的给定日期都有多行。第一个表中的id 24有3个日期,第二个表中有3个日期。结果连接有9行,每个组合一个。

要解决此问题,请在加入之前进行聚合

SELECT dt.ticket_id, SUM(dt.precio), iva, total 
FROM devolucion d INNER JOIN
     (select dt_ticket_id, sum(dt.precio) as precio, sum(dt.iva) as iva, sum(total) as total
      from detalle_ticket dt 
      group by dt_ticket_id
     ) dt
     ON d.detalle_ticket_ticket_id = dt.ticket_id 
WHERE DATE(d.fecha) = '2013-06-04'

我还添加了ivatotal的聚合。他们似乎失踪了。