Disculpa visoalgt si utilizo el pivot y quiero quitar los valores nulos, ya sea cambiarlos a cero o reemplazarlos por algún otro valor varchar o entero se puede ??????? de verdad lo necesito
No debería ser problema los valores negativos, para tener mas detalle únete a facebook.com/groups/SQLSERVERLATAM/ y comparte tu problema para que te pueda colaborar y entender de que se trata
Tengo que realizar un reporte y en ese realizar comparación de ingresos por planilla (2 planillas) , el código de planilla deberá ser el encabezado de cada columna, ademas esos códigos de la planilla serán parámetros,.. Como puedo realizar eso!?
Hola Victor tengo una consulta con respecto a un reporte que estoy tratando de hacer. Tengo la siguiente consulta: Select T3.Itemcode AS Referencia,T3.CodeBars as UPC,T3.ItemName as Descripcion, sum(T1.Quantity)Cantidad,Datepart(yyyy,T0.DocDate)as Anio,DATEPART(mm, T0.DocDate) as Mes From INV1 T1 inner join OINV T0 on T0.Docentry = T1.DocEntry inner join OITM T3 on T1.ItemCode = T3.Itemcode where (T0.DocDate BETWEEN '2016-07-01' and '2017-07-30')and T1.WhsCode = '01' group by T3.Itemcode,T3.CodeBars,T3.ItemName,T0.DocDate,Datepart(yyyy,T0.DocDate),DATEPART(mm, T0.DocDate) El Resultado es algo como esto: Referencia UPC Descripcion Cantidad Anio Mes 000015 0002390000015 VAPORUB JAR ORG 12/6oz 63 2017 1 00002665 4017941026651 30871 MST ID POCKET WITH 4 CC 200 2016 11 00002760 4017941027603 25200 BOHEME BLK RED STN BP 15 2016 7 00002851 4017941028518 P146 LEGRAND PLATINO PLUMA FUENTE 1 2016 12 00002865 4017941028655 P163 CLASSIQUE PLAT FI BK RB 5 2016 8 00005020 4017941050205 23364 SLTR CLASSIQUE DOUE BLK STEELBP 2 2017 4 00005096 4017941050960 25300 RB BOHEME ROUGE MID SIZE 20 2016 7 00005524 30661 BILLETERA CON 9CC 1 2016 12 00005524 30661 BILLETERA CON 9CC 1 2017 3 00005525 4017941055255 30662 BILLFOLD 6CC MONEY CLIP 1 2016 8 00005525 4017941055255 30662 BILLFOLD 6CC MONEY CLIP 1 2016 12 00005525 4017941055255 30662 BILLFOLD 6CC MONEY CLIP 1 2017 6 00005796 4017941057969 BOHEME BLEU WITH SAPPHIRE RB 25330 1 2016 9 00007162 4017941200822 BILLFOLD CALF LEATHER 11CC W / ID 1 2016 12 00007163 BILLFOLD 8CC CALF LEATHER 1 2016 12 00007163 BILLFOLD 8CC CALF LEATHER 1 2017 3 00007165 NULL MST BILLFOLD 14CC ZIP COINPURSE 10 2016 7 00007167 4017941200877 MST BUSINESS CARD HLDR 2CC 1 2016 12 Lo que quiero lograr es que se muestre la venta de cada articulo en un periodo de tiempo de la siguiente manera Referencia UPC Descripcion Enero 200x febrero 200x...Dic 200x enero 200x 00002760 4017941027603 SLTR CLASSIQUE DOUE BLK STEELBP xxx xxxx Que muestre en cada mes cuanto se vendio de cada producto en el periodo, creo que el pivot seria la solución pero no se como hacer que se agrupe por año y mes. Agradecería si me pudieras dar alguna luz con respecto a mi pregunta. saludos desde Panamá
Podrias concatenar el año y mes de dos maneras, uno con la funcion concat que seria concat(DATEPART(mm, T0.DocDate), '-', DATEPART(yyyy,T0.DocDate)) o simplemente usando el operador + DATEPART(mm, T0.DocDate)+ '-'+ DATEPART(yyyy,T0.DocDate, concatenado el mes y la fecha este nuevo campo te puede servir para agrupar.
Lo hice asi : DateName(month,T0.DocDate) + ' ' +DateName(year,T0.DocDate) y parece funcionar, lo único es que tengo que escribir cada mes y año en el query, existe alguna forma de hacer lo automatico? Select * from (select * from [#TablaTest])s Pivot ( max(Cantidad) for [fechacompleta]in ([July 2016],[August 2016],[September 2016],[October 2016], [November 2016],[December 2016],[January 2017],[February 2017],[March 2017],[April 2017],[May 2017], [June 2017])) P Saludos y gracias por el dato.
Colocar un select dentro de los paréntesis no es posible, pero podrías crear un sql dinámico que construya los valores que necesitas dentro del paréntesis, por ejemplo el emplo del video con sql dinámico quedaría así: DECLARE @anios NVARCHAR(400) SET @anios ='' SELECT @anios = @anios + '[' + T.anio + '],' from (Select distinct cast ((datepart(yyyy, orderdate)) as varchar(150)) as anio from orders ) as T SET @anios = LEFT(@anios, LEN(@anios) -1) Exec (' Select * from (Select c.categoryName, datepart(yyyy, o.orderdate) as anio , (d.unitprice * d.quantity) as total from categories as c inner join products as p on c.categoryid=p.categoryid inner join [order details] as d on d.productid=p.productid inner join orders as o on o.orderid=d.orderid ) as T Pivot (sum(Total) for anio in ('+ @anios +')) as pvt')
tengo sql server 2008 y se me presento el siguiente error Mens. 102, Nivel 15, Estado 1, Línea 14 Sintaxis incorrecta cerca de '('. investigando lo solucione con el siguiente codigo que sirve parra modificar la compatibilidad de la base de datos ALTER DATABASE northwind SET COMPATIBILITY_LEVEL = 100 despues se ejecuta el query y funciona
Estimado, bueno su video. Tengo un caso que no he podido resolver... podria ayudarme? Tengo un pivote dinamico que funciona pero quiero utilizar sus resultados ojala para crear una vista. Tengo entendido que podría si primero creo una tabla temporal. ¿Podría decirme cómo por favor? Este es el código: declare @attr varchar(max)declare @sql varchar(max)set @attr=''set @sql=' select RUT_Trabajador, NumLiqs, Año, Mes, #attr# from ( SELECT [Filtrar Inv_Liq_calculadas_20_le].RUT_Trabajador, [Filtrar Inv_Liq_calculadas_20_le].NumLiqs, [Filtrar Inv_Liq_calculadas_20_le].Año, [Filtrar Inv_Liq_calculadas_20_le].Mes, [Filtrar Inv_Liq_calculadas_20_le].Items_trabajadores, Sum([Filtrar Inv_Liq_calculadas_20_le].Valor) AS SumaDeValor FROM rem.[Filtrar Inv_Liq_calculadas_20_le] GROUP BY [Filtrar Inv_Liq_calculadas_20_le].RUT_Trabajador, [Filtrar Inv_Liq_calculadas_20_le].NumLiqs, [Filtrar Inv_Liq_calculadas_20_le].Año, [Filtrar Inv_Liq_calculadas_20_le].Mes, [Filtrar Inv_Liq_calculadas_20_le].Items_trabajadores ) as source pivot( sum(SumaDeValor) for Items_trabajadores in ( #attr# ) ) as SumaDeValor ' select @attr=@attr+'['+V.Items_trabajadores+'],'from ( select distinct Items_trabajadores from rem.[Filtrar Inv_Liq_calculadas_20_le] ) as V set @attr=SUBSTRING(@attr,0,len(@attr)) set @sql=REPLACE(@sql,'#attr#',@attr) print @sql exec(@sql)
@@visoalgt y 5 años despues consulto. ¿tendrías un ejemplo de cómo hacer eso? Reutilizar los campos de PIVOT (sin hacer INSERT INTO una tabla global con ##). Gracias
With Ventas (compañia, año, total) as ( Select c.companyname, DATEPART(YYYY, o.orderdate) as año, SUM(d.unitprice*d.quantity) from Customers as c inner join [Orders] as o on c.CustomerID=o.CustomerID inner join [Order Details] as d on o.OrderID=d.OrderID group by c.CompanyName, DATEPART(YYYY, o.OrderDate) ) select * from Ventas Pivot ( SUM (Total) For año in ([1996],[1997],[1998]) ) PVTVENTAS y al ejecutarlo me da error en la lina del sum Mens. 102, Nivel 15, Estado 1, Línea 14 Sintaxis incorrecta cerca de '('. gracias y por la ayuda que das en tu canal
visoalgt buena tarde buscando soluciones encontré que lo que lo que debía actualizar era el nivel de compatibilidad y ejecute el siguiente comando EXEC sp_dbcmptlevel 'DatabaseName', 100 luego ejecute el query y corrió a la perfección gracias por tus videos que como a mi a muchos que nos gusta esto de las bases de datos aprendemos de este material que publicas saludos
Muchas gracias, buscaba en muchas partes y no mas no le entendía pivot ... eres un genio explicando
Muchas gracias por realizar el pivot con esas consultas 🤓
Muchas gracias hermano, Excelente material!!!! 2020
Excelente material, michas gracias !!!
Gracias crack
gracias video
buenisimo! gracias =)
super bueno me sacaste de un aprieto
La funcion PIVOT y WITH se puede utilizar en SQL Server 2000 ??
Disculpa visoalgt si utilizo el pivot y quiero quitar los valores nulos, ya sea cambiarlos a cero o reemplazarlos por algún otro valor varchar o entero se puede ???????
de verdad lo necesito
No tendrías algún tutorial para cube y rollup master?
+Diego Viveros Trabajaremos en ello. Saludos!
wey muy grande
Al momento de usar el ORDER BY despues del pivot solo me funciona solo para una de las filas creadas. No sé si te suceda lo mismo. 7:08
Tendria que convertir su pivot a una vista y luego odenarla por cualquier columna.
Tengo Sql Server 2008 r2. Y el pivot no quiere funcionar en una columna con valores negativos.
No debería ser problema los valores negativos, para tener mas detalle únete a facebook.com/groups/SQLSERVERLATAM/ y comparte tu problema para que te pueda colaborar y entender de que se trata
Tengo que realizar un reporte y en ese realizar comparación de ingresos por planilla (2 planillas) , el código de planilla deberá ser el encabezado de cada columna, ademas esos códigos de la planilla serán parámetros,.. Como puedo realizar eso!?
Solo con lo que indicas crea un procedimiento almacenado
Hola Victor tengo una consulta con respecto a un reporte que estoy tratando de hacer.
Tengo la siguiente consulta:
Select T3.Itemcode AS Referencia,T3.CodeBars as UPC,T3.ItemName as Descripcion,
sum(T1.Quantity)Cantidad,Datepart(yyyy,T0.DocDate)as Anio,DATEPART(mm, T0.DocDate) as Mes
From INV1 T1 inner join OINV T0 on T0.Docentry = T1.DocEntry
inner join OITM T3 on T1.ItemCode = T3.Itemcode
where (T0.DocDate BETWEEN '2016-07-01' and '2017-07-30')and T1.WhsCode = '01'
group by T3.Itemcode,T3.CodeBars,T3.ItemName,T0.DocDate,Datepart(yyyy,T0.DocDate),DATEPART(mm, T0.DocDate)
El Resultado es algo como esto:
Referencia UPC Descripcion Cantidad Anio Mes
000015 0002390000015 VAPORUB JAR ORG 12/6oz 63 2017 1
00002665 4017941026651 30871 MST ID POCKET WITH 4 CC 200 2016 11
00002760 4017941027603 25200 BOHEME BLK RED STN BP 15 2016 7
00002851 4017941028518 P146 LEGRAND PLATINO PLUMA FUENTE 1 2016 12
00002865 4017941028655 P163 CLASSIQUE PLAT FI BK RB 5 2016 8
00005020 4017941050205 23364 SLTR CLASSIQUE DOUE BLK STEELBP 2 2017 4
00005096 4017941050960 25300 RB BOHEME ROUGE MID SIZE 20 2016 7
00005524 30661 BILLETERA CON 9CC 1 2016 12
00005524 30661 BILLETERA CON 9CC 1 2017 3
00005525 4017941055255 30662 BILLFOLD 6CC MONEY CLIP 1 2016 8
00005525 4017941055255 30662 BILLFOLD 6CC MONEY CLIP 1 2016 12
00005525 4017941055255 30662 BILLFOLD 6CC MONEY CLIP 1 2017 6
00005796 4017941057969 BOHEME BLEU WITH SAPPHIRE RB 25330 1 2016 9
00007162 4017941200822 BILLFOLD CALF LEATHER 11CC W / ID 1 2016 12
00007163 BILLFOLD 8CC CALF LEATHER 1 2016 12
00007163 BILLFOLD 8CC CALF LEATHER 1 2017 3
00007165 NULL MST BILLFOLD 14CC ZIP COINPURSE 10 2016 7
00007167 4017941200877 MST BUSINESS CARD HLDR 2CC 1 2016 12
Lo que quiero lograr es que se muestre la venta de cada articulo en un periodo de tiempo
de la siguiente manera
Referencia UPC Descripcion Enero 200x febrero 200x...Dic 200x enero 200x
00002760 4017941027603 SLTR CLASSIQUE DOUE BLK STEELBP xxx xxxx
Que muestre en cada mes cuanto se vendio de cada producto en el periodo, creo que el pivot seria la solución pero no se como hacer que se agrupe por año y mes.
Agradecería si me pudieras dar alguna luz con respecto a mi pregunta.
saludos desde Panamá
Podrias concatenar el año y mes de dos maneras, uno con la funcion concat que seria concat(DATEPART(mm, T0.DocDate), '-', DATEPART(yyyy,T0.DocDate)) o simplemente usando el operador + DATEPART(mm, T0.DocDate)+ '-'+ DATEPART(yyyy,T0.DocDate, concatenado el mes y la fecha este nuevo campo te puede servir para agrupar.
Lo hice asi : DateName(month,T0.DocDate) + ' ' +DateName(year,T0.DocDate) y parece funcionar, lo único es que tengo que escribir cada mes y año en el query, existe alguna forma de hacer lo automatico?
Select * from (select * from [#TablaTest])s
Pivot ( max(Cantidad) for [fechacompleta]in ([July 2016],[August 2016],[September 2016],[October 2016],
[November 2016],[December 2016],[January 2017],[February 2017],[March 2017],[April 2017],[May 2017],
[June 2017])) P
Saludos y gracias por el dato.
Colocar un select dentro de los paréntesis no es posible, pero podrías crear un sql dinámico que construya los valores que necesitas dentro del paréntesis, por ejemplo el emplo del video con sql dinámico quedaría así:
DECLARE @anios NVARCHAR(400)
SET @anios =''
SELECT @anios = @anios + '[' + T.anio + '],'
from (Select distinct cast ((datepart(yyyy, orderdate)) as varchar(150)) as anio from orders ) as T
SET @anios = LEFT(@anios, LEN(@anios) -1)
Exec ('
Select * from
(Select c.categoryName, datepart(yyyy, o.orderdate) as anio
, (d.unitprice * d.quantity) as total
from categories as c inner join products as p on c.categoryid=p.categoryid
inner join [order details] as d on d.productid=p.productid
inner join orders as o on o.orderid=d.orderid
) as T
Pivot (sum(Total) for anio in ('+ @anios +')) as pvt')
Lo intento y te comento como me va con eso, gracias por tu tiempo y videos, son buenisimos, yo estoy tratando de verlos todos.
saludos
muy bueno gracias y como pondria los años automatico sin que escriba si tuviera mas años en listas
Ve su nuevo vídeo, dice como hacerlo dinámico.
tengo sql server 2008 y se me presento el siguiente error
Mens. 102, Nivel 15, Estado 1, Línea 14
Sintaxis incorrecta cerca de '('.
investigando lo solucione con el siguiente codigo que sirve parra modificar la compatibilidad de la base de datos
ALTER DATABASE northwind
SET COMPATIBILITY_LEVEL = 100
despues se ejecuta el query y funciona
me acaba de pasar lo mismo, puedes intentar con un select previo, es decir ' select * from (tuselectelchido) as x pivot .... etc... ' suerte
Estimado, bueno su video. Tengo un caso que no he podido resolver... podria ayudarme? Tengo un pivote dinamico que funciona pero quiero utilizar sus resultados ojala para crear una vista. Tengo entendido que podría si primero creo una tabla temporal. ¿Podría decirme cómo por favor? Este es el código:
declare @attr varchar(max)declare @sql varchar(max)set @attr=''set @sql='
select
RUT_Trabajador, NumLiqs, Año, Mes,
#attr#
from
(
SELECT [Filtrar Inv_Liq_calculadas_20_le].RUT_Trabajador, [Filtrar Inv_Liq_calculadas_20_le].NumLiqs, [Filtrar Inv_Liq_calculadas_20_le].Año, [Filtrar Inv_Liq_calculadas_20_le].Mes, [Filtrar Inv_Liq_calculadas_20_le].Items_trabajadores, Sum([Filtrar Inv_Liq_calculadas_20_le].Valor) AS SumaDeValor
FROM rem.[Filtrar Inv_Liq_calculadas_20_le]
GROUP BY [Filtrar Inv_Liq_calculadas_20_le].RUT_Trabajador, [Filtrar Inv_Liq_calculadas_20_le].NumLiqs, [Filtrar Inv_Liq_calculadas_20_le].Año, [Filtrar Inv_Liq_calculadas_20_le].Mes, [Filtrar Inv_Liq_calculadas_20_le].Items_trabajadores
) as source pivot(
sum(SumaDeValor)
for Items_trabajadores in (
#attr#
)
) as SumaDeValor
'
select @attr=@attr+'['+V.Items_trabajadores+'],'from (
select distinct Items_trabajadores from rem.[Filtrar Inv_Liq_calculadas_20_le]
) as V
set @attr=SUBSTRING(@attr,0,len(@attr))
set @sql=REPLACE(@sql,'#attr#',@attr)
print @sql
exec(@sql)
Mil disculpas por no contestar antes, yo he utilizado pivots dentro de funciones y procedimientos almacenados y reutilizado los valores devueltos
@@visoalgt y 5 años despues consulto. ¿tendrías un ejemplo de cómo hacer eso? Reutilizar los campos de PIVOT (sin hacer INSERT INTO una tabla global con ##). Gracias
With Ventas (compañia, año, total) as
(
Select
c.companyname, DATEPART(YYYY, o.orderdate) as año, SUM(d.unitprice*d.quantity)
from
Customers as c
inner join [Orders] as o on c.CustomerID=o.CustomerID
inner join [Order Details] as d on o.OrderID=d.OrderID
group by
c.CompanyName, DATEPART(YYYY, o.OrderDate)
)
select * from Ventas
Pivot (
SUM (Total)
For año in ([1996],[1997],[1998])
) PVTVENTAS
y al ejecutarlo me da error en la lina del sum
Mens. 102, Nivel 15, Estado 1, Línea 14
Sintaxis incorrecta cerca de '('.
gracias y por la ayuda que das en tu canal
He copiado y pegado en mi SQL tu script y funciona perfecto, la pregunta que me surge es que version de SQL estas usando?
Gracias por responder, la versión es 2014
visoalgt buena tarde buscando soluciones encontré que lo que lo que debía actualizar era el nivel de compatibilidad y ejecute el siguiente comando EXEC sp_dbcmptlevel 'DatabaseName', 100 luego ejecute el query y corrió a la perfección gracias por tus videos que como a mi a muchos que nos gusta esto de las bases de datos aprendemos de este material que publicas saludos