Tengo una tabla con productos, pedidos, precios, fecha de venta. Necesito crear una tabla con las ventas de un producto en un solo día. Usé sqlite y este código funcionó bien:

/* Groups order date <-> product */
CREATE TEMPORARY TABLE IF NOT EXISTS tableDate AS
SELECT DISTINCT A.orderDate, B.productName
FROM ordini AS A
CROSS JOIN ordini AS B;

/* Groups orders by product and date */
CREATE TEMPORARY TABLE IF NOT EXISTS tableOrders AS
SELECT COUNT(productQty) AS total, productName, SUM(totalAmount) AS amount, orderDate
FROM ordini WHERE (orderStatus >= 3)
GROUP BY orderDate, productName;

/* Selects the product sells data, grouped day by day */
SELECT orderDate, productName, COALESCE(total, 0) AS total, IFNULL(amount, 0) AS amount
FROM (SELECT * FROM tableDate
LEFT OUTER JOIN tableOrders ON tableOrders.orderDate = tableDate.orderDate AND tableOrders.productName = tableDate.productName)
ORDER BY orderDate;

Como dije, este código funcionó bastante bien con sqlite (con "TEMP VIEW" en lugar de "TEMPORARY TABLE"), pero con mysql obtengo " Cada tabla derivada debe tener su propio alias ". Así que he agregado un alias en la última selección:

 /* Selects the data of sells, grouped by day */
SELECT orderDate, productName, COALESCE(total, 0) AS total, IFNULL(amount, 0) AS amount
FROM (SELECT * FROM tableDate
LEFT OUTER JOIN tableOrders ON tableOrders.orderDate = tableDate.orderDate AND tableOrders.productName = tableDate.productName) AS MyAlias
ORDER BY orderDate;

Y ahora aparece " Nombre de columna duplicado 'productName' ". Ahora estoy bastante seguro de que he probado casi todas las combinaciones posibles de nombre de tabla y nombre de producto, pero aún así no puedo deshacerme de ese error.

0
FloDD 22 jun. 2020 a las 18:53

2 respuestas

La mejor respuesta

En la consulta interna:

SELECT * 
FROM tableDate LEFT OUTER JOIN tableOrders 
ON tableOrders.orderDate = tableDate.orderDate 
AND tableOrders.productName = tableDate.productName

Selecciona todas las columnas de ambas tablas.
Entonces, en el resultado hay 2 columnas llamadas productName de las 2 tablas (lo mismo para la columna orderDate) y esto no está permitido.
En la lista de selección, especifique solo uno de cada par de columnas y cualquier otra columna que desee y suelte *:

SELECT d.productName, d.orderDate , ......  
FROM tableDate d LEFT OUTER JOIN tableOrders o 
ON o.orderDate = d.orderDate 
AND o.productName = d.productName

Usé alias para los nombres de las tablas para acortar el código.

2
forpas 22 jun. 2020 a las 16:00

El error que está recibiendo es porque la columna productName existe tanto en tableDate como en tableOrders en su subconsulta, pero el motor SQL no sabe qué columna usar porque usted ' re SELECT *, que extrae todas las columnas de ambas tablas. Los nombres de columna en una tabla derivada deben ser únicos, por lo que obtendrá el error.

Pero no necesita la sub-selección, o el JOIN en absoluto. Su consulta podría simplificarse para:

SELECT 
     o.orderDate
    ,o.productName
    ,COALESCE(o.total, 0) AS total 
    ,COALESCE(o.amount, 0) AS amount 
FROM 
    tableOrders AS o
ORDER BY o.orderDate;

Todos los campos que está seleccionando son solo de esa tabla.

1
Eric Brandt 22 jun. 2020 a las 16:13