example - sql sum group by
MySQL encuentra subtotales (4)
EDITAR:
Me dijeron que hacer que ustedes lean significa que recibo menos atención. Mis disculpas. Aquí hay una versión más simple:
Bill recibió $ 100 dólares en artículos de una tienda.
Él quiere devolver suficientes artículos para recuperar exactamente $ 30 dólares.
La tienda tiene un sistema Point of Return que lo ayudará a hacer esto.
Aquí están los datos después de que escanea sus artículos:
item ¦ price ¦
socks 4.00
cheap tv 22.00
book on tape 9.00
book on paper 7.00
party hats 3.00
picture frame 10.00
hammer 5.00
juicer 16.00
mysql guide 24.00
total items ¦ total price ¦
9 100.00
Option 1
===============
item ¦ price ¦
cheap tv 22.00
party hats 3.00
hammer 5.00
===============
Option 2
===============
item ¦ price ¦
socks 4.00
picture frame 10.00
juicer 16.00
===============
Option 3
===============
item ¦ price ¦
book on tape 9.00
hammer 5.00
juicer 16.00
Probablemente me perdí algunas opciones, ya que inventé todo esto.
Entonces, la gran pregunta es:
¿Hay alguna manera (con GROUP BY, probablemente) de tener una consulta que devuelva una posible combinación de elementos?
¡Gracias!
un
Está pidiendo todos los subconjuntos que suman exactamente $ 30.
Esto se parece mucho al problema de la suma del subconjunto y al problema de la mochila , así que dudo que pueda hacer esto con una simple consulta. Probablemente tendrías que recurrir a T-SQL, pero incluso eso probablemente se vería feo.
Creo que la programación es el camino a seguir aquí.
No creo que el grupo pueda hacerlo.
No puedo pensar en una mejor manera que encontrar / probar todas las permutaciones, ya sea en su lenguaje de programación de elección o con un procedimiento almacenado.
si tuviera artículos de más de 30 $, podría omitirlos.
Habría algunas mejoras si quisieras una "mejor" opción según algunos criterios.
Si la cantidad de elementos es lo suficientemente pequeña, puede forzar esto con SQL. Esta podría ser una solución rápida de escribir, pero es probable que desee hacer algo más inteligente. Suena como el " problema de la mochila " que es NP completo.
Si la cantidad de elementos es grande, deberá profundizar en los algoritmos de programación dinámica. Debe preguntarse qué tan importante es esto para su aplicación.
Si la cantidad de artículos es relativamente pequeña, es posible que puedas usar la fuerza bruta. Una declaración SQL de fuerza bruta (que es lo que solicitó) que encuentra combinaciones de 1,2 o 3 elementos que coinciden es la siguiente. Si esto no es satisfactorio, entonces tal vez SQL no es la herramienta adecuada para este trabajo.
SELECT
i1.id AS id1,
NULL AS id2,
NULL AS id3,
i1.amount
FROM
items i1
UNION ALL
SELECT
i1.id AS id1,
i2.id AS id2,
i3.id AS id3,
i1.amount + i2.amount AS total
FROM
items i1,
items i2
WHERE
i1.amount + i2.amount = 30 AND
i1.id <> i2.id AND
i1.id <> i3.id
UNION ALL
SELECT
i1.id AS id1,
i2.id AS id2,
i3.id AS id3,
i1.amount + i2.amount + i3.amount AS total
FROM
items i1,
items i2,
items i3
WHERE
i1.amount + i2.amount + i3.amount = 30 AND
i1.id <> i2.id AND
i1.id <> i3.id AND
i2.id <> i3.id
En Oracle, usaría la función CUBE para convertir esto en una versión genérica, sin estar seguro acerca de un equivalente MySQL.
Este problema es, de hecho, P / NP. por ejemplo, es probable que no pueda encontrar LOS MEJORES precios de artículos adecuados, sin la búsqueda de fuerza bruta, y si la tienda de sus clientes es grande, puede encontrar esa búsqueda de larga duración.
Puede usar algunos de los algoritmos existentes que pueden darle una buena idea, pero me temo que no son SQL.
Sugeriría hacer una aproximación de su problema:
Cree un procedimiento / consulta que encuentre UN artículo que mejor se adapte al precio deseado, y luego llámelo nuevamente para conocer los cambios nuevos que tenga. No es perfecto, pero hará el trabajo.