varias unir una tablas tabla subconsultas sola relacionadas misma inner filas ejemplos consultas consultar consulta sql group-by

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.