3

我有两张桌子

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(values 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

先感谢您。

4

2 回答 2

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    |
于 2013-06-05T14:15:38.410 回答
1

问题是两个表中的给定日期都有多行。第一个表中有 3 个日期为 id 24,第二个表中有 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'

iva我还为和添加了聚合total。他们似乎不见了。

于 2013-06-05T14:11:46.430 回答