SQL Server - Ayuda Group By

   
Vista:

Ayuda Group By

Publicado por Martin (10 intervenciones) el 20/07/2013 00:06:27
Buenas tardes a todos, tengo un problema para agrupar unos registros de una view de sql server 2008 /r2 y es que no se mucho de sql, la vista funciona perfecto solo que no se donde debo poner la clausula group by para que se agrupe la informacion por vendedor (dbo.gbkmut.res_id ), les dejo mi codigo a ver si pueden orientarme.

Gracias...

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
SELECT     TOP (100) PERCENT dbo.gbkmut.res_id AS SlsRep, reshumres.fullname AS SlsName, dbo.gbkmut.docdate, YEAR(dbo.gbkmut.docdate) AS year,
                      MONTH(dbo.gbkmut.docdate) AS month, CASE WHEN YEAR(gbkmut.docdate) = YEAR(getdate()) THEN CASE WHEN month(gbkmut.docdate) = month(getdate())
                      THEN - bdr_hfl ELSE 0 END ELSE 0 END AS MonthToDate, CASE WHEN YEAR(gbkmut.docdate) = YEAR(getdate()) THEN CASE WHEN month(gbkmut.docdate)
                      <> month(getdate()) THEN - bdr_hfl ELSE 0 END ELSE 0 END AS YearToDate, CASE WHEN YEAR(gbkmut.docdate) <> YEAR(getdate())
                      THEN CASE WHEN month(gbkmut.docdate) = month(getdate()) THEN - bdr_hfl ELSE 0 END ELSE 0 END AS LastYearMonth, CASE WHEN YEAR(gbkmut.docdate)
                      <> YEAR(getdate()) THEN CASE WHEN month(gbkmut.docdate) <> month(getdate()) THEN - bdr_hfl ELSE 0 END ELSE 0 END AS LastYear,
                      CASE WHEN YEAR(gbkmut.docdate) = YEAR(getdate()) THEN CASE WHEN month(gbkmut.docdate) = month(getdate())
                      THEN '1 MonthToDate' ELSE '1  YearToDate' END ELSE CASE WHEN month(gbkmut.docdate) = month(getdate())
                      THEN '2 LastMonthToDate' ELSE '2  LastYearToDate' END END AS Period, - dbo.gbkmut.bdr_hfl AS Total
FROM         dbo.gbkmut LEFT OUTER JOIN
                      dbo.humres AS reshumres ON dbo.gbkmut.res_id = reshumres.res_id INNER JOIN
                      dbo.grtbk ON dbo.grtbk.reknr = dbo.gbkmut.reknr LEFT OUTER JOIN
                      dbo.Items ON dbo.gbkmut.artcode = dbo.Items.ItemCode
WHERE     (dbo.gbkmut.transtype IN ('N', 'C', 'P')) AND (dbo.gbkmut.ReminderCount <= 15) AND (dbo.grtbk.omzrek IN ('J')) AND (dbo.gbkmut.transsubtype <> 'X') AND
                      (dbo.gbkmut.res_id > 0)
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de Geri Réshef

Ayuda Group By

Publicado por Geri Réshef GeriReshef@GMail.com (17 intervenciones) el 21/07/2013 15:12:51
El "TOP (100) PERCENT" es absolutamente redundante.

La clausula Group By debe aparecer después de la clausula Where:
Group By dbo.gbkmut.res_id

Tomá en cuenta que todas las columnas en la clausula Select que no aparecen en la Group By deben tomar funciones de agregado (Sum, Count, Max etcétera).
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Ayuda Group By

Publicado por Martin (10 intervenciones) el 22/07/2013 16:38:52
Hola Geri Réshef, agradezco tu ayuda y te comento que traté de hacer lo que me indicas pero me pierdo en la parte de las funciones, solo agregué al final del código la instruccion como me indicaste pero solo me muestra todos los registros ordenados de cada vendedor, me falta la function para que solo me muestre uno globalizado de cada vendedor pero no supe hacerlo, me puedes dar alguna pista o ejemplo de como hacerlo?:

gracias...

GROUP BY dbo.gbkmut.res_id, reshumres.fullname, dbo.gbkmut.docdate, dbo.gbkmut.bdr_hfl
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Geri

Ayuda Group By

Publicado por Geri (17 intervenciones) el 22/07/2013 21:20:12
Intentá el siguiente Select:
SELECT dbo.gbkmut.res_id AS SlsRep,
reshumres.fullname AS SlsName,
dbo.gbkmut.docdate,
Max(YEAR(dbo.gbkmut.docdate)) AS year,
Max(MONTH(dbo.gbkmut.docdate)) AS month,
Sum(CASE WHEN YEAR(gbkmut.docdate) = YEAR(getdate()) THEN
CASE WHEN month(gbkmut.docdate) = month(getdate()) THEN - bdr_hfl
ELSE 0
END
ELSE 0
END) AS MonthToDate,
Sum(CASE WHEN YEAR(gbkmut.docdate) = YEAR(getdate()) THEN
CASE WHEN month(gbkmut.docdate) <> month(getdate()) THEN - bdr_hfl
ELSE 0
END
ELSE 0
END) AS YearToDate,
Sum(CASE WHEN YEAR(gbkmut.docdate) <> YEAR(getdate()) THEN
CASE WHEN month(gbkmut.docdate) = month(getdate()) THEN - bdr_hfl
ELSE 0
END
ELSE 0
END) AS LastYearMonth,
Sum(CASE WHEN YEAR(gbkmut.docdate) <> YEAR(getdate()) THEN
CASE WHEN month(gbkmut.docdate) <> month(getdate()) THEN - bdr_hfl
ELSE 0
END
ELSE 0
END) AS LastYear,
Max(CASE WHEN YEAR(gbkmut.docdate) = YEAR(getdate()) THEN
CASE WHEN month(gbkmut.docdate) = month(getdate()) THEN '1 MonthToDate'
ELSE '1 YearToDate'
END
ELSE CASE WHEN month(gbkmut.docdate) = month(getdate()) THEN '2 LastMonthToDate'
ELSE '2 LastYearToDate'
END
END) AS Period,
- dbo.gbkmut.bdr_hfl AS Total
Técnicamente - el código debe ser correcto, pero dudo si tiene sentido.
Por ejemplo - me parece que el Month y el Year deben aparecer también en la clausula Group By.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar