SQL Server - PIVOT

 
Vista:
sin imagen de perfil
Val: 67
Ha mantenido su posición en SQL Server (en relación al último mes)
Gráfica de SQL Server

PIVOT

Publicado por Ana (34 intervenciones) el 07/03/2018 13:26:23
Buenos días a tod@s,

He creado un procedimiento en SQL Server 2017, utilizando PIVOT, ya que tiene que ser dinámico, ya que a veces, me vendrán con más campos.

Yo tengo esta estructura de tablas donde recupero los datos.

tabla principal:
id nombre
1 nombre1
2 nombre2
3 nombre3


Tabla2
id idTablaPrincipal gastos importe
1 1 ITV 100
2 2 gasolina 50
3 2 Peaje 200
4 3 ITV 100



Este es mi PIVOT:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
SET @dinamicPivot =
	N'SELECT id, nombre, ' + @columnName + ', importe
	FROM
		(
			SELECT  CGA.id, CGA.nombre, CGA.nombre2 As columna, CGA.baseImponible As importe
			FROM	 tablaPrincipal AGF
					INNER JOIN tabla2 TC ON TC.id = AGF.id
		) As miPivot
	PIVOT
		(
		AVG(miPivot.BI)
		FOR miPivot.columna IN (' + @columnName + ')
		) As pivotable
	ORDER BY fecha'


Y lo que me aparece es:

id nombre ITV gasolina Peaje
1 nombre1 100
2 nombre2 50
2 nombre2 200
3 nombre3 100


Y yo la quiero de la siguiente manera:

id nombre ITV gasolina Peaje
1 nombre1 100
2 nombre2 50 200
3 nombre3 100

Muchas gracias de antemano.

Un saludo

Ana
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 Isaias
Val: 3.250
Oro
Ha mantenido su posición en SQL Server (en relación al último mes)
Gráfica de SQL Server

PIVOT

Publicado por Isaias (4558 intervenciones) el 07/03/2018 20:36:12
Veamos, dime si te es funcional
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
create table TablaPrincipal  (ID INT, NOMBRE VARCHAR(50))
INSERT INTO TablaPrincipal VALUES(
--id nombre
1, 'nombre1'),
(2, 'nombre2'),
(3, 'nombre3')
 
create table TablaSecundaria (id int, idTablaPrincipal int, [gastos] varchar(20), [importe] money)
--id idTablaPrincipal gastos importe
INSERT INTO TablaSecundaria VALUES(
1, 1, 'ITV', 100),
(2, 2, 'gasolina', 50),
(3, 2, 'Peaje', 200),
(4, 3, 'ITV', 100)
 
declare @columnas varchar(max)
 
set @columnas = ''
 
select @columnas = coalesce(@columnas + '[' + cast(gastos as varchar(12)) + '],', '')
FROM (select distinct gastos from TablaSecundaria) as dtm
 
set @columnas = left(@columnas,LEN(@columnas)-1)
 
DECLARE @SQLString nvarchar(500);
 
set @SQLString = N'
    SELECT *
	FROM
    (SELECT TablaPrincipal.[id], [nombre], [gastos], [importe] 
        FROM TablaPrincipal inner join TablaSecundaria on TablaPrincipal.id = TablaSecundaria.id ) AS SourceTable
    PIVOT
    (
    AVG([importe])
    FOR [gastos] IN (' + @columnas + ')
    ) AS PivotTable;'
-- print @SQLString
EXECUTE sp_executesql @SQLString
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
Imágen de perfil de Isaias
Val: 3.250
Oro
Ha mantenido su posición en SQL Server (en relación al último mes)
Gráfica de SQL Server

PIVOT

Publicado por Isaias (4558 intervenciones) el 07/03/2018 22:26:32
Modifica esta parte, gracias

1
2
3
4
5
6
7
8
9
10
11
12
set @SQLString = N'
    SELECT id, nombre, isnull(gasolina,0) Gasolina, isnull(ITV, 0) ITV, isnull(Peaje,0) Peaje
	FROM
    (SELECT TablaPrincipal.[id], [nombre], [gastos], [importe] 
        FROM TablaPrincipal inner join TablaSecundaria on TablaPrincipal.id = TablaSecundaria.idTablaPrincipal ) AS SourceTable
    PIVOT
    (
    AVG([importe])
    FOR [gastos] IN (' + @columnas + ')
    ) AS PivotTable;'
-- print @SQLString
EXECUTE sp_executesql @SQLString
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
sin imagen de perfil
Val: 67
Ha mantenido su posición en SQL Server (en relación al último mes)
Gráfica de SQL Server

PIVOT

Publicado por Ana (34 intervenciones) el 08/03/2018 09:35:23
Hola Isaias,

Muchas gracias por tu aportación.

Lo he probado, pero me sigue apareciendo igual, se me duplican los registros.

SELECT id, nombre, isnull(gasolina,0) Gasolina, isnull(ITV, 0) ITV, isnull(Peaje,0) Peaje

No puedo ponerlo así, ya que tiene que ser dinámico, ya que puede ser que tenga esos campos u otros.

Voy a seguir mirando. No se como hacerlo.

Muchas gracias.

Un saludo

Ana
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 Isaias
Val: 3.250
Oro
Ha mantenido su posición en SQL Server (en relación al último mes)
Gráfica de SQL Server

PIVOT

Publicado por Isaias (4558 intervenciones) el 08/03/2018 22:59:20
De acuerdo, entonces solo quita los nombres de las columnas, yo las puse solo para hacer el ISNULL

1
2
3
4
5
6
7
8
9
10
set @SQLString = N'
    SELECT *     -- Quitas los nombres de las columnas, listo
	FROM
    (SELECT TablaPrincipal.[id], [nombre], [gastos], [importe] 
        FROM TablaPrincipal inner join TablaSecundaria on TablaPrincipal.id = TablaSecundaria.idTablaPrincipal ) AS SourceTable
    PIVOT
    (
    AVG([importe])
    FOR [gastos] IN (' + @columnas + ')
    ) AS PivotTable;'
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
sin imagen de perfil
Val: 67
Ha mantenido su posición en SQL Server (en relación al último mes)
Gráfica de SQL Server

PIVOT

Publicado por Ana (34 intervenciones) el 09/03/2018 09:19:27
Tampoco funciona, me salen los registros duplicados.

Seguiré mirando o cambio de táctica.

Muchas gracias.

Un saludo
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
sin imagen de perfil
Val: 67
Ha mantenido su posición en SQL Server (en relación al último mes)
Gráfica de SQL Server

PIVOT

Publicado por Ana (34 intervenciones) el 09/03/2018 10:39:45
Solucionado, ya que no me había dado cuenta que estaba utilizando en el PIVOT el campo BI, que lo estaba utilizando para realizar una suma dentro del select.

Muchas gracias por tu ayuda Isaias.

Un saludo

Ana
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