2011-10-05 100 views
6

Tengo precios en dos tablas diferentes y quiero restarlos (precio actual-precio del último día) y PEDIRlos en formato DESC. Me preguntaba si se puede hacer usando un solo comando MySQL.Restar valores en MySQL Tabla

estructura de tabla

Table 1 
id | Item Name | Date  | Price 
1 | alpha  | 2011-10-05 | 10 
2 | beta  | 2011-10-05 | 12 
3 | gamma  | 2011-10-05 | 14 

Table 2 
id | Item Name | Date  | Price 
1 | alpha  | 2011-10-04 | 8 
2 | beta  | 2011-10-04 | 10 
3 | gamma  | 2011-10-04 | 12 
4 | alpha  | 2011-10-03 | 4 
5 | beta  | 2011-10-03 | 6 
6 | gamma  | 2011-10-03 | 8 

Respuesta

5
SELECT 
table1.id, table1.`Item Name`, 
table1.`Date` AS CurrDate, table1.Price AS CurrPrice, 
table2.`Date` AS PrevDate, table2.Price AS PrevPrice, 
table1.Price - table2.Price AS Difference 
FROM table1 
LEFT JOIN table2 ON table1.id = table2.id AND table1.`Date` - INTERVAL 1 DAY = table2.`Date` 
ORDER BY Difference DESC 

No hay nada especial acerca de esta consulta, excepto la forma en que he usado el LEFT JOIN. Creo que si las tasas de ayer para un registro no están disponibles, las últimas tres columnas contendrían NULO. Salida:

id | Item Name | CurrDate | CurrPrice | PrevDate | PrevPrice | Difference 
2 | beta  | 2011-10-05 | 12  | 2011-10-04 | 10  | 2 
3 | gamma  | 2011-10-05 | 14  | 2011-10-04 | 12  | 2 
1 | alpha  | 2011-10-05 | 10  | 2011-10-04 | 8   | 2 
+0

funciona! gracias: D –

4
SELECT 
    a.price as price1 
    , IFNULL(b.price,'(no data)') as price2 
    , (a.price - IFNULL(b.price,0)) as difference 
FROM table1 a 
LEFT JOIN table2 b ON (a.`item name` = b.`item name`) 
GROUP BY a.`item name` 
HAVING IFNULL(b.`date`,'') = MAX(IFNULL(b.`date`,'') 

Así es como funciona.

Selecciona los datos de 2 tablas: todos los datos de la tabla 1 y los datos correspondientes de la tabla 2.
Si no puede encontrar los datos coincidentes de la tabla 2, sustituirá los valores null en lugar de las filas faltantes. (left join)

entonces grupos (group by) filas juntos basan en table1.item name.
Esto combina varias filas por artículo.
La cláusula having corrige esto al seleccionar solo las filas de fecha más recientes de la tabla2.

Una pequeña corrección va integrado en las cláusulas y selecthaving a tratar el caso cuando no hay datos en la Tabla 2 para que coincida con tabla1.

Su consulta debe ser:

SELECT 
    s.closing as price1 
    , IFNULL(sh.closing,'(no data)') as price2 
    , (s.closing - IFNULL(sh.closing,0)) as difference 
FROM stocks s 
LEFT JOIN stockhistory sh ON (s.symbol = sh.symbol) 
GROUP BY s.symbol 
HAVING IFNULL(sh.edate,'') = MAX(IFNULL(sh.edate,'') 
LIMIT 30 OFFSET 0; 
+0

Gracias por el código, pero realmente apreciaría si usted podría explicar un poco demasiado para que sea útil en el futuro :) –

+0

estoy consiguiendo el error siguiente: # 1064 - Usted tiene una error en su sintaxis de SQL; revise el manual que corresponde a su versión del servidor MySQL para la sintaxis correcta para usar cerca de 'LIMIT 0, 30' en la línea 2 –

+0

@SaadBashir, Mi consulta no tiene 'limit', copie y pegue toda la consulta en un comentario y Le echaré un vistazo. (BTW 'limit 30 offset 0' es la ** última ** instrucción en la consulta, no parte de la cláusula de selección) – Johan