Agrupar en un query (2009-09-14)

14/09/2009 - 13:28 por Mauricio | Informe spam
Hola a todos,
tengo este query divertido:

SELECT distinct
PROGRP_DESCRIPTION, PRO_DESCRIPTION, FT_NAME, OL_FOOD_REMARK, (SELECT
sum(OL_Quantity) FROM MCS_ORDERLINES OL
inner join MCS_ORDERS ORD ON OL.OL_ORD_ID = ORD.ORD_ID
inner join MCS_PRODUCTS PRO ON OL.OL_PRO_ID = PRO.PRO_ID
inner join MCS_ProductGroups PROGRP ON PRO.PRO_PROGRP_ID =
PROGRP.PROGRP_ID
inner join MCS_FoodTypes FT ON OL.OL_FT_ID = FT.FT_ID
WHERE
OL_DATE BETWEEN '20090901 00:00:00' AND '20090914 23:59:59' AND
OL.OL_Portion_Size = 1 AND
OL.OL_ORD_ID = MCS_ORDERS.ORD_ID AND OL.OL_PRO_ID = MCS_PRODUCTS.PRO_ID
AND
PRO.PRO_PROGRP_ID = MCS_ProductGroups.PROGRP_ID AND
OL.OL_FT_ID = Mcs_FoodTypes.FT_ID) AS Cantidad1,
(SELECT sum(OL_Quantity) FROM MCS_ORDERLINES OL
inner join MCS_ORDERS ORD ON OL.OL_ORD_ID = ORD.ORD_ID
inner join MCS_PRODUCTS PRO ON OL.OL_PRO_ID = PRO.PRO_ID
inner join MCS_ProductGroups PROGRP ON PRO.PRO_PROGRP_ID =
PROGRP.PROGRP_ID
inner join MCS_FoodTypes FT ON OL.OL_FT_ID = FT.FT_ID
WHERE
OL_DATE BETWEEN '20090901 00:00:00' AND '20090914 23:59:59' AND
OL.OL_Portion_Size = 2 AND
OL.OL_ORD_ID = MCS_ORDERS.ORD_ID AND OL.OL_PRO_ID = MCS_PRODUCTS.PRO_ID
AND
PRO.PRO_PROGRP_ID = MCS_ProductGroups.PROGRP_ID AND
OL.OL_FT_ID = Mcs_FoodTypes.FT_ID) AS Cantidad2,
(SELECT sum(OL_Quantity) FROM MCS_ORDERLINES OL
inner join MCS_ORDERS ORD ON OL.OL_ORD_ID = ORD.ORD_ID
inner join MCS_PRODUCTS PRO ON OL.OL_PRO_ID = PRO.PRO_ID
inner join MCS_ProductGroups PROGRP ON PRO.PRO_PROGRP_ID =
PROGRP.PROGRP_ID
inner join MCS_FoodTypes FT ON OL.OL_FT_ID = FT.FT_ID
WHERE
OL_DATE BETWEEN '20090901 00:00:00' AND '20090914 23:59:59' AND
OL.OL_Portion_Size = 3 AND
OL.OL_ORD_ID = MCS_ORDERS.ORD_ID AND OL.OL_PRO_ID = MCS_PRODUCTS.PRO_ID
AND
PRO.PRO_PROGRP_ID = MCS_ProductGroups.PROGRP_ID AND
OL.OL_FT_ID = Mcs_FoodTypes.FT_ID) AS Cantidad3
FROM MCS_ORDERLINES
inner join MCS_ORDERS ON OL_ORD_ID = ORD_ID
inner join MCS_PRODUCTS ON OL_PRO_ID = PRO_ID
inner join MCS_ProductGroups ON PRO_PROGRP_ID = PROGRP_ID
inner join MCS_FoodTypes ON OL_FT_ID = FT_ID
WHERE
OL_DATE BETWEEN '20090901 00:00:00' AND '20090914 23:59:59'

Que me da el siguiente resultado:
Group 9999 Abrikos, tørret Food type 1 NULL NULL 0.000 NULL
Group 9999 Abrikos, tørret Food type 1 NULL 2.000 NULL NULL
Group 9999 Abrikos, tørret Food type 1 Test 1.000 NULL NULL
Group 9999 Brøndkarse, rå Food type 1 NULL NULL NULL 1.000
Group 9999 Brøndkarse, rå Food type 1 NULL 2.000 NULL NULL
Group 9999 Bønnespirer, soja, konserves
Food type 1 dsfdsfsd 4.000 NULL NULL
Group one Oksemørbrad Food type 1 NULL NULL NULL 3.000
Group one Oksemørbrad Food type 1 NULL 6.000 NULL NULL
Group one Recipe 6003 Food type 1 NULL NULL NULL 1.000
Group one Recipe 6003 Food type 1 NULL NULL 0.000 NULL
Group one Recipe 6003 Food type 1 NULL 2.000 NULL NULL

Si nos fijamos en las 2 primeras filas las 4 primeras columnas son
iguales. Cómo puedo agrupar el query por esas 4 columnas?
Gracias desde ya.

Mauricio
Copenhague, Dinamarca

Preguntas similare

Leer las respuestas

#6 Carlos Sacristan
15/09/2009 - 12:15 | Informe spam
Pues a falta de la estructura de tu tabla, lo que pides se podría hacer con
el operador PIVOT. Echa un vistazo a este ejemplo:

*****************************************

use tempdb
go

create table f (
idF int identity(1,1)
, articulo varchar(20) not null
, idT char(1) not null
, cantidad int not null
)

insert f (articulo, idT, cantidad)
select 'falda', 'S', 3
union
select 'falda', 'M', 5
union
select 'falda', 'L', 8
union
select 'camiseta', 'S', 5
union
select 'camiseta', 'M', 10
union
select 'camiseta', 'L', 7
GO

SELECT articulo, [S] AS tallaS, [M] AS TallaM, [L] AS tallaL
FROM
(SELECT cantidad, articulo, idT
FROM f) AS p
PIVOT
(
SUM (cantidad)
FOR IdT IN
( [S], [M], [L] )
) AS pvt
ORDER BY articulo;

*****************************************

"Caminar sobre el agua y desarrollar software a partir de unas
especificaciones es fácil, si ambas están congeladas."
Edward V. Berard, ingeniero informático

http://blogs.solidq.com/es/elrincondeldba


"Mauricio" wrote in message
news:
Hola Carlos,
voy con otro ejemplo, a ver si puedo hacerlo más claro. Supongamos un
negocio que vende ropa y tiene 3 talles, S, M y L.
Si la tabla de líneas de factura tiene el artículo vendido, la cantidad
y su talle necesito un listado de este tipo:

Artículo Talle S Talle M Talle L
Falda 3 5 8
Camiseta 5 10 7

Hay forma de hacer esto con una sentencia SQL? O debo trabajarlo con
código?
Muchas gracias por tu tiempo y paciencia.
Saludos.


Carlos Sacristan a exprimé avec précision :
Por lo que veo, los valores siguientes a los cuatro primeros son
subselects. Si aparecen valores repetidos es porque te faltan campos que
combinar

"Caminar sobre el agua y desarrollar software a partir de unas
especificaciones es fácil, si ambas están congeladas."
Edward V. Berard, ingeniero informático

http://blogs.solidq.com/es/elrincondeldba


"Mauricio" wrote in message
news:
La idea es obtener algo así:

Grupo Descripción Tipo Observacion Tam1 Tam2 Tam3 Tam4
9999 Abrikos Food Type 1 Algo aquí 1 0 1 2

Es decir que agrupo las primeras 4 y muestro qué cantidad de porciones
de tamaño 1, tamaño 2, etc. tengo por cada uno de esos agrupamientos.
Se entiende? No me resulta muy sencillo de explicar.

Carlos Sacristan avait énoncé :
¿Y qué valor quieres mostrar del resto de las columnas? O, dicho de
otro modo, ¿qué función de agregado habría que aplicar al resto de las
columnas para hacer la fila única?

"Caminar sobre el agua y desarrollar software a partir de unas
especificaciones es fácil, si ambas están congeladas."
Edward V. Berard, ingeniero informático

http://blogs.solidq.com/es/elrincondeldba


"Mauricio" wrote in message
news:
Hola a todos,
tengo este query divertido:

SELECT distinct
PROGRP_DESCRIPTION, PRO_DESCRIPTION, FT_NAME, OL_FOOD_REMARK, (SELECT
sum(OL_Quantity) FROM MCS_ORDERLINES OL
inner join MCS_ORDERS ORD ON OL.OL_ORD_ID = ORD.ORD_ID
inner join MCS_PRODUCTS PRO ON OL.OL_PRO_ID = PRO.PRO_ID
inner join MCS_ProductGroups PROGRP ON PRO.PRO_PROGRP_ID =
PROGRP.PROGRP_ID
inner join MCS_FoodTypes FT ON OL.OL_FT_ID = FT.FT_ID
WHERE
OL_DATE BETWEEN '20090901 00:00:00' AND '20090914 23:59:59' AND
OL.OL_Portion_Size = 1 AND
OL.OL_ORD_ID = MCS_ORDERS.ORD_ID AND OL.OL_PRO_ID =
MCS_PRODUCTS.PRO_ID AND
PRO.PRO_PROGRP_ID = MCS_ProductGroups.PROGRP_ID AND
OL.OL_FT_ID = Mcs_FoodTypes.FT_ID) AS Cantidad1,
(SELECT sum(OL_Quantity) FROM MCS_ORDERLINES OL
inner join MCS_ORDERS ORD ON OL.OL_ORD_ID = ORD.ORD_ID
inner join MCS_PRODUCTS PRO ON OL.OL_PRO_ID = PRO.PRO_ID
inner join MCS_ProductGroups PROGRP ON PRO.PRO_PROGRP_ID =
PROGRP.PROGRP_ID
inner join MCS_FoodTypes FT ON OL.OL_FT_ID = FT.FT_ID
WHERE
OL_DATE BETWEEN '20090901 00:00:00' AND '20090914 23:59:59' AND
OL.OL_Portion_Size = 2 AND
OL.OL_ORD_ID = MCS_ORDERS.ORD_ID AND OL.OL_PRO_ID =
MCS_PRODUCTS.PRO_ID AND
PRO.PRO_PROGRP_ID = MCS_ProductGroups.PROGRP_ID AND
OL.OL_FT_ID = Mcs_FoodTypes.FT_ID) AS Cantidad2,
(SELECT sum(OL_Quantity) FROM MCS_ORDERLINES OL
inner join MCS_ORDERS ORD ON OL.OL_ORD_ID = ORD.ORD_ID
inner join MCS_PRODUCTS PRO ON OL.OL_PRO_ID = PRO.PRO_ID
inner join MCS_ProductGroups PROGRP ON PRO.PRO_PROGRP_ID =
PROGRP.PROGRP_ID
inner join MCS_FoodTypes FT ON OL.OL_FT_ID = FT.FT_ID
WHERE
OL_DATE BETWEEN '20090901 00:00:00' AND '20090914 23:59:59' AND
OL.OL_Portion_Size = 3 AND
OL.OL_ORD_ID = MCS_ORDERS.ORD_ID AND OL.OL_PRO_ID =
MCS_PRODUCTS.PRO_ID AND
PRO.PRO_PROGRP_ID = MCS_ProductGroups.PROGRP_ID AND
OL.OL_FT_ID = Mcs_FoodTypes.FT_ID) AS Cantidad3
FROM MCS_ORDERLINES
inner join MCS_ORDERS ON OL_ORD_ID = ORD_ID
inner join MCS_PRODUCTS ON OL_PRO_ID = PRO_ID
inner join MCS_ProductGroups ON PRO_PROGRP_ID = PROGRP_ID
inner join MCS_FoodTypes ON OL_FT_ID = FT_ID
WHERE
OL_DATE BETWEEN '20090901 00:00:00' AND '20090914 23:59:59'

Que me da el siguiente resultado:
Group 9999 Abrikos, tørret Food type 1 NULL NULL 0.000 NULL
Group 9999 Abrikos, tørret Food type 1 NULL 2.000 NULL NULL
Group 9999 Abrikos, tørret Food type 1 Test 1.000 NULL NULL
Group 9999 Brøndkarse, rå Food type 1 NULL NULL NULL 1.000
Group 9999 Brøndkarse, rå Food type 1 NULL 2.000 NULL NULL
Group 9999 Bønnespirer, soja, konserves Food type 1 dsfdsfsd 4.000
NULL NULL
Group one Oksemørbrad Food type 1 NULL NULL NULL 3.000
Group one Oksemørbrad Food type 1 NULL 6.000 NULL NULL
Group one Recipe 6003 Food type 1 NULL NULL NULL 1.000
Group one Recipe 6003 Food type 1 NULL NULL 0.000 NULL
Group one Recipe 6003 Food type 1 NULL 2.000 NULL NULL

Si nos fijamos en las 2 primeras filas las 4 primeras columnas son
iguales. Cómo puedo agrupar el query por esas 4 columnas?
Gracias desde ya.

Copenhague, Dinamarca







Copenhague, Dinamarca







Mauricio
Copenhague, Dinamarca


Respuesta Responder a este mensaje
#7 Mauricio
15/09/2009 - 12:59 | Informe spam
Gracias Carlos,
esto es lo que andaba buscando. Ahora tengo que ver cómo armar mi
consulta con mis tablas.
Un saludo.


Carlos Sacristan a émis l'idée suivante :
Pues a falta de la estructura de tu tabla, lo que pides se podría hacer con
el operador PIVOT. Echa un vistazo a este ejemplo:

*****************************************

use tempdb
go

create table f (
idF int identity(1,1)
, articulo varchar(20) not null
, idT char(1) not null
, cantidad int not null
)

insert f (articulo, idT, cantidad)
select 'falda', 'S', 3
union
select 'falda', 'M', 5
union
select 'falda', 'L', 8
union
select 'camiseta', 'S', 5
union
select 'camiseta', 'M', 10
union
select 'camiseta', 'L', 7
GO

SELECT articulo, [S] AS tallaS, [M] AS TallaM, [L] AS tallaL
FROM
(SELECT cantidad, articulo, idT
FROM f) AS p
PIVOT
(
SUM (cantidad)
FOR IdT IN
( [S], [M], [L] )
) AS pvt
ORDER BY articulo;

*****************************************

"Caminar sobre el agua y desarrollar software a partir de unas
especificaciones es fácil, si ambas están congeladas."
Edward V. Berard, ingeniero informático

http://blogs.solidq.com/es/elrincondeldba


"Mauricio" wrote in message
news:
Hola Carlos,
voy con otro ejemplo, a ver si puedo hacerlo más claro. Supongamos un
negocio que vende ropa y tiene 3 talles, S, M y L.
Si la tabla de líneas de factura tiene el artículo vendido, la cantidad y
su talle necesito un listado de este tipo:

Artículo Talle S Talle M Talle L
Falda 3 5 8
Camiseta 5 10 7

Hay forma de hacer esto con una sentencia SQL? O debo trabajarlo con
código?
Muchas gracias por tu tiempo y paciencia.
Saludos.


Carlos Sacristan a exprimé avec précision :
Por lo que veo, los valores siguientes a los cuatro primeros son
subselects. Si aparecen valores repetidos es porque te faltan campos que
combinar

"Caminar sobre el agua y desarrollar software a partir de unas
especificaciones es fácil, si ambas están congeladas."
Edward V. Berard, ingeniero informático

http://blogs.solidq.com/es/elrincondeldba


"Mauricio" wrote in message
news:
La idea es obtener algo así:

Grupo Descripción Tipo Observacion Tam1 Tam2 Tam3 Tam4
9999 Abrikos Food Type 1 Algo aquí 1 0 1 2

Es decir que agrupo las primeras 4 y muestro qué cantidad de porciones
de tamaño 1, tamaño 2, etc. tengo por cada uno de esos agrupamientos.
Se entiende? No me resulta muy sencillo de explicar.

Carlos Sacristan avait énoncé :
¿Y qué valor quieres mostrar del resto de las columnas? O, dicho de otro
modo, ¿qué función de agregado habría que aplicar al resto de las
columnas para hacer la fila única?

"Caminar sobre el agua y desarrollar software a partir de unas
especificaciones es fácil, si ambas están congeladas."
Edward V. Berard, ingeniero informático

http://blogs.solidq.com/es/elrincondeldba


"Mauricio" wrote in message
news:
Hola a todos,
tengo este query divertido:

SELECT distinct
PROGRP_DESCRIPTION, PRO_DESCRIPTION, FT_NAME, OL_FOOD_REMARK, (SELECT
sum(OL_Quantity) FROM MCS_ORDERLINES OL
inner join MCS_ORDERS ORD ON OL.OL_ORD_ID = ORD.ORD_ID
inner join MCS_PRODUCTS PRO ON OL.OL_PRO_ID = PRO.PRO_ID
inner join MCS_ProductGroups PROGRP ON PRO.PRO_PROGRP_ID =
PROGRP.PROGRP_ID
inner join MCS_FoodTypes FT ON OL.OL_FT_ID = FT.FT_ID
WHERE
OL_DATE BETWEEN '20090901 00:00:00' AND '20090914 23:59:59' AND
OL.OL_Portion_Size = 1 AND
OL.OL_ORD_ID = MCS_ORDERS.ORD_ID AND OL.OL_PRO_ID = MCS_PRODUCTS.PRO_ID
AND
PRO.PRO_PROGRP_ID = MCS_ProductGroups.PROGRP_ID AND
OL.OL_FT_ID = Mcs_FoodTypes.FT_ID) AS Cantidad1,
(SELECT sum(OL_Quantity) FROM MCS_ORDERLINES OL
inner join MCS_ORDERS ORD ON OL.OL_ORD_ID = ORD.ORD_ID
inner join MCS_PRODUCTS PRO ON OL.OL_PRO_ID = PRO.PRO_ID
inner join MCS_ProductGroups PROGRP ON PRO.PRO_PROGRP_ID =
PROGRP.PROGRP_ID
inner join MCS_FoodTypes FT ON OL.OL_FT_ID = FT.FT_ID
WHERE
OL_DATE BETWEEN '20090901 00:00:00' AND '20090914 23:59:59' AND
OL.OL_Portion_Size = 2 AND
OL.OL_ORD_ID = MCS_ORDERS.ORD_ID AND OL.OL_PRO_ID = MCS_PRODUCTS.PRO_ID
AND
PRO.PRO_PROGRP_ID = MCS_ProductGroups.PROGRP_ID AND
OL.OL_FT_ID = Mcs_FoodTypes.FT_ID) AS Cantidad2,
(SELECT sum(OL_Quantity) FROM MCS_ORDERLINES OL
inner join MCS_ORDERS ORD ON OL.OL_ORD_ID = ORD.ORD_ID
inner join MCS_PRODUCTS PRO ON OL.OL_PRO_ID = PRO.PRO_ID
inner join MCS_ProductGroups PROGRP ON PRO.PRO_PROGRP_ID =
PROGRP.PROGRP_ID
inner join MCS_FoodTypes FT ON OL.OL_FT_ID = FT.FT_ID
WHERE
OL_DATE BETWEEN '20090901 00:00:00' AND '20090914 23:59:59' AND
OL.OL_Portion_Size = 3 AND
OL.OL_ORD_ID = MCS_ORDERS.ORD_ID AND OL.OL_PRO_ID = MCS_PRODUCTS.PRO_ID
AND
PRO.PRO_PROGRP_ID = MCS_ProductGroups.PROGRP_ID AND
OL.OL_FT_ID = Mcs_FoodTypes.FT_ID) AS Cantidad3
FROM MCS_ORDERLINES
inner join MCS_ORDERS ON OL_ORD_ID = ORD_ID
inner join MCS_PRODUCTS ON OL_PRO_ID = PRO_ID
inner join MCS_ProductGroups ON PRO_PROGRP_ID = PROGRP_ID
inner join MCS_FoodTypes ON OL_FT_ID = FT_ID
WHERE
OL_DATE BETWEEN '20090901 00:00:00' AND '20090914 23:59:59'

Que me da el siguiente resultado:
Group 9999 Abrikos, tørret Food type 1 NULL NULL 0.000 NULL
Group 9999 Abrikos, tørret Food type 1 NULL 2.000 NULL NULL
Group 9999 Abrikos, tørret Food type 1 Test 1.000 NULL NULL
Group 9999 Brøndkarse, rå Food type 1 NULL NULL NULL 1.000
Group 9999 Brøndkarse, rå Food type 1 NULL 2.000 NULL NULL
Group 9999 Bønnespirer, soja, konserves Food type 1 dsfdsfsd 4.000 NULL
NULL
Group one Oksemørbrad Food type 1 NULL NULL NULL 3.000
Group one Oksemørbrad Food type 1 NULL 6.000 NULL NULL
Group one Recipe 6003 Food type 1 NULL NULL NULL 1.000
Group one Recipe 6003 Food type 1 NULL NULL 0.000 NULL
Group one Recipe 6003 Food type 1 NULL 2.000 NULL NULL

Si nos fijamos en las 2 primeras filas las 4 primeras columnas son
iguales. Cómo puedo agrupar el query por esas 4 columnas?
Gracias desde ya.

Copenhague, Dinamarca







Copenhague, Dinamarca







Copenhague, Dinamarca







Mauricio
Copenhague, Dinamarca
email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una pregunta AnteriorRespuesta Tengo una respuesta
Search Busqueda sugerida