una - unir dos tablas sql server
Seleccione varias columnas de una tabla, pero agrupe por una (8)
El nombre de la tabla es "Detalles del pedido" y las columnas se indican a continuación:
OrderDetailID || ProductID || ProductName || OrderQuantity
Estoy tratando de seleccionar varias columnas y Agrupar por Id. De producto mientras tengo la SUMA de OrderQuantity.
Select ProductID,ProductName,OrderQuantity Sum(OrderQuantity)
from OrderDetails Group By ProductID
Pero, por supuesto, este código da un error. Tengo que agregar otros nombres de columna al grupo, pero eso no es lo que quiero y dado que mis datos tienen muchos elementos, los resultados son inesperados de esa manera.
Consulta de datos de muestra:
ProductID, ProductName, OrderQuantity de OrderDetails
Los resultados están abajo:
ProductID ProductName OrderQuantity
1001 abc 5
1002 abc 23 (ProductNames can be same)
2002 xyz 8
3004 ytp 15
4001 aze 19
1001 abc 7 (2nd row of same ProductID)
Resultado Esperado:
ProductID ProductName OrderQuantity
1001 abc 12 (group by productID while summing)
1002 abc 23
2002 xyz 8
3004 ytp 15
4001 aze 19
¿Cómo selecciono varias columnas y la columna Agrupar por Id. De producto ya que ProductName no es único?
Mientras hace eso, también obtenga la suma de la columna OrderQuantity.
== EDIT ==
Revisé tu pregunta otra vez y he concluido que esto no se puede hacer.
ProductName no es único, debe ser parte del Group By
o excluido de sus resultados.
Por ejemplo, ¿cómo le presentaría SQL estos resultados si agrupara solo por ID de producto?
ProductID | ProductName | OrderQuantity
---------------------------------------
1234 | abc | 1
1234 | def | 1
1234 | ghi | 1
1234 | jkl | 1
Puedes probar esto:
Select ProductID,ProductName,Sum(OrderQuantity)
from OrderDetails Group By ProductID, ProductName
Solo se requieren las columnas Group By
que no vienen con una función agregada en la cláusula Select
. Así que solo puedes usar Group By
ProductID y ProductName en este caso.
Puedes probar la siguiente consulta. Supongo que tiene una sola tabla para todos sus datos.
SELECT OD.ProductID, OD.ProductName, CalQ.OrderQuantity
FROM (SELECT DISTINCT ProductID, ProductName
FROM OrderDetails) OD
INNER JOIN (SELECT ProductID, OrderQuantity SUM(OrderQuantity)
FROM OrderDetails
GROUP BY ProductID) CalQ
ON CalQ.ProductID = OD.ProductID
Uso este truco para agrupar por una columna cuando tengo una selección de varias columnas:
SELECT MAX(id) AS id,
Nume,
MAX(intrare) AS intrare,
MAX(iesire) AS iesire,
MAX(intrare-iesire) AS stoc,
MAX(data) AS data
FROM Produse
GROUP BY Nume
ORDER BY Nume
Esto funciona.
SELECT ProductID, ProductName, OrderQuantity, SUM(OrderQuantity) FROM OrderDetails WHERE(OrderQuantity) IN(SELECT SUM(OrderQuantity) FROM OrderDetails GROUP BY OrderDetails) GROUP BY ProductID, ProductName, OrderQuantity;
Utilicé la solución anterior para resolver un problema similar en Oracle12c.
Tu información
DECLARE @OrderDetails TABLE
(ProductID INT,ProductName VARCHAR(10), OrderQuantity INT)
INSERT INTO @OrderDetails VALUES
(1001,''abc'',5),(1002,''abc'',23),(2002,''xyz'',8),(1002,''abc'',1),
(3004,''ytp'',15),(4001,''aze'',19),(1001,''abc'',7),(1001,''abc'',2)
Consulta
Select ProductID,ProductName, Sum(OrderQuantity) Total
from @OrderDetails
Group By ProductID ,ProductName
Resultado
╔═══════════╦═════════════╦═══════╗
║ ProductID ║ ProductName ║ Total ║
╠═══════════╬═════════════╬═══════╣
║ 1001 ║ abc ║ 14 ║
║ 1002 ║ abc ║ 24 ║
║ 4001 ║ aze ║ 19 ║
║ 2002 ║ xyz ║ 8 ║
║ 3004 ║ ytp ║ 15 ║
╚═══════════╩═════════════╩═══════╝
mysql GROUP_CONCAT
function podría ayudar dev.mysql.com/doc/refman/8.0/en/…
SELECT ProductID, GROUP_CONCAT(DISTINCT ProductName) as Names, SUM(OrderQuantity)
FROM OrderDetails GROUP BY ProductID
Esto volvería:
ProductID Names OrderQuantity
1001 red 5
1002 red,black 6
1003 orange 8
1004 black,orange 15
Una idea similar a la que @Urs Marian publicó aquí https://.com/a/38779277/906265
WITH CTE_SUM AS (
SELECT ProductID, Sum(OrderQuantity) AS TotalOrderQuantity
FROM OrderDetails GROUP BY ProductID
)
SELECT DISTINCT OrderDetails.ProductID, OrderDetails.ProductName, OrderDetails.OrderQuantity,CTE_SUM.TotalOrderQuantity
FROM
OrderDetails INNER JOIN CTE_SUM
ON OrderDetails.ProductID = CTE_SUM.ProductID
Por favor, compruebe si esto funciona.