Tengo una gran base de datos de la tabla en la que necesito para realizar la acción por debajo de forma dinámica utilizando Microsoft SQL Server.

De un resultado como este:

 badge   |   name   |   Job   |   KDA   |   Match 
 - - - - - - - - - - - - - - - -
 T996    |  Darrien |   AP    |   3.0   |   20
 T996    |  Darrien |   ADC   |   2.8   |   16
 T996    |  Darrien |   TOP   |   5.0   |   120

A un resultado como este en el uso de SQL:

badge   |   name   |  AP_KDA | AP_Match | ADC_KDA | ADC_Match | TOP_KDA | TOP_Match 
- - - - - - - - -
T996    |  Darrien |   3.0   |   20     |  2.8    |   16      |   5.0   |  120      

Incluso si hay 30 filas, también se combinan en una sola fila con 60 columnas.

Actualmente soy capaz de hacerlo mediante la codificación duro (vea el ejemplo de abajo), pero no de forma dinámica.

Select badge,name,
(
 SELECT max(KDA)
 FROM table
 WHERE (h.badge = badge) AND (h.name = name) 
 AND (Job = 'AP')
) AP_KDA,
(
 SELECT max(Match)
 FROM table
 WHERE (h.badge = badge) AND (h.name = name) 
 AND (Job = 'AP')
) AP_Match,
(
 SELECT max(KDA)
 FROM table
 WHERE (h.badge = badge) AND (h.name = name) 
 AND (Job = 'ADC')
) ADC_KDA,
(
 SELECT max(Match)
 FROM table
 WHERE (h.badge = badge) AND (h.name = name) 
 AND (Job = 'ADC')
) ADC_Match,
(
 SELECT max(KDA)
 FROM table
 WHERE (h.badge = badge) AND (h.name = name) 
 AND (Job = 'TOP')
) TOP_KDA,
(
 SELECT max(Match)
 FROM table
 WHERE (h.badge = badge) AND (h.name = name) 
 AND (Job = 'TOP')
) TOP_Match
from table h

Necesito un MSSQL declaración de que me permite combinar varias filas en una fila. La columna 3 (Job) el contenido se combinan con la columna 4 y 5 de encabezados (KDA y Match) y convertirse en una nueva columna.

Por lo tanto, si hay 6 valores distintos para Job (decir Job1 a través de Job6), entonces el resultado será de 12 columnas, por ejemplo: Job1_KDA, Job1_Match, Job2_KDA, Job2_Match, etc., agrupados por insignia y el nombre.

Necesito una declaración que puede bucle a través de la columna de datos 3 así que no es necesario codificar (repetir la consulta para cada una de las posibles Job valor) o utilizar una tabla temporal.

hola a todos, la pregunta que me he preguntando es una mssql declaración de que me permite combinar varias filas en una fila. La columna 3 contenido se combinan con la columna 4,5 encabezado y convertirse en una nueva columna. Así que si hay 6 tipos diferentes de datos en la columna 3, entonces se va a producir de 12 columnas. por ejemplo: Job1_KDA, Job1_Match, Job2_KDA, Job2_Match, Job3_KDA, Job3_Match, Job4_KDA, Job4_Match
Hay muchas preguntas relacionadas con aquí. Búsqueda [sql-server] pivot para múltiples ejemplos de hacer exactamente lo que estás preguntando. Por ejemplo, esta pregunta se realiza un similar tipo de operación (a pesar de que convierte seis filas en tres).

OriginalEl autor chabu | 2014-02-11

2 Comentarios

  1. 10

    Me gustaría hacer uso de sql dinámico, pero esto es (http://sqlfiddle.com/#!6/a63a6/1/0) el PIVOTE solución:

    SELECT badge, name, [AP_KDa], [AP_Match], [ADC_KDA],[ADC_Match],[TOP_KDA],[TOP_Match] FROM
    (
    SELECT badge, name, col, val FROM(
     SELECT *, Job+'_KDA' as Col, KDA as Val FROM @T 
     UNION
     SELECT *, Job+'_Match' as Col,Match as Val  FROM @T
    ) t
    ) tt
    PIVOT ( max(val) for Col in ([AP_KDa], [AP_Match], [ADC_KDA],[ADC_Match],[TOP_KDA],[TOP_Match]) ) AS pvt

    Bonus: Esta forma de PIVOTE puede ser combinado con SQL dinámico (http://sqlfiddle.com/#!6/a63a6/7/0), de nuevo yo prefiero hacerlo más simple, sin PIVOTE, pero esto es sólo el buen ejercicio para mí :

    SELECT badge, name, cast(Job+'_KDA' as nvarchar(128)) as Col, KDA as Val INTO #Temp1 FROM Temp 
    INSERT INTO #Temp1 SELECT badge, name, Job+'_Match' as Col, Match as Val FROM Temp
    
    DECLARE @columns nvarchar(max)
    SELECT @columns = COALESCE(@columns + ', ', '') + Col FROM #Temp1 GROUP BY Col
    
    DECLARE @sql nvarchar(max) = 'SELECT badge, name, '[email protected]columns+' FROM #Temp1 PIVOT ( max(val) for Col in ('[email protected]columns+') ) AS pvt'
    exec (@sql)
    
    DROP TABLE #Temp1
    Hola Roman, gracias por sugerir una solución. Pero esto no resuelve mi caso, como tengo el nombre de la columna de crearse a sí mismos de forma dinámica y no codificarlo. Cómo puedo hacer que el PIVOTE declaración no variable estática como AP_KDA,AP_Match pero algo como Trabajo+’_KDA’,Trabajo+’_Match’?
    Pensé que te dio una respuesta diciendo que ‘el uso de sql dinámico’. ¿Necesitas ayuda para escribir la dinámica de la consulta? PIVOTE fue wroted por mí sólo porque yo rara vez uso de ellos y esto fue muy interesante para mí.
    Parece estar bien, pero me da un error al final de la línea. DECLARE @sql de tipo nvarchar(max) = ‘SELECCIONE insignia, nombre, ‘[email protected]+’ DE #Temp1 PIVOTE ( max(val) para Col (‘[email protected]+’) ) COMO pvt’ me da este error. Msg 139, Nivel 15, Estado 1, Línea 0 No se puede asignar un valor predeterminado a una variable local. Msg 137, Nivel 15, Estado 2, Línea 6 Debe declarar la variable escalar «@sql». He buscado en la solución de error, todos los usuarios que mencionar también a la necesidad de convertir las columnas en las de tipo nvarchar, así que así lo hice. Ya he convertido a todas las columnas de tipo nvarchar, pero todavía no puede resolver este error.
    nvm, he resuelto yo mismo, parece ser que mis datos dentro consiguió % que hace le sale mal. Ahora funciona como un encanto, gracias!

    OriginalEl autor Roman Pokrovskij

  2. 1

    Combinar varias filas y columnas en una fila y group by ID

    IF OBJECT_ID('usr_CUSTOMER') IS NOT NULL 
    DROP TABLE usr_CUSTOMER
    --------------------------CRATE TABLE---------------------------------------------------
    GO
    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO
    CREATE TABLE [dbo].[usr_CUSTOMER](
    [Last_Name] [nvarchar](50) NULL,
    [First_Name] [nvarchar](50) NULL,
    [Middle_Name] [nvarchar](50) NOT NULL,
    [ID] [int] NULL
    ) ON [PRIMARY]
    GO
    INSERT [dbo].[usr_CUSTOMER] ([Last_Name], [First_Name], [Middle_Name], [ID]) VALUES (N'gal', N'ornon', N'gili', 111)
    GO
    INSERT [dbo].[usr_CUSTOMER] ([Last_Name], [First_Name], [Middle_Name], [ID]) VALUES (N'porat', N'Yahel', N'LILl', 44444)
    GO
    INSERT [dbo].[usr_CUSTOMER] ([Last_Name], [First_Name], [Middle_Name], [ID]) VALUES (N'Shabtai', N'Or', N'Orya', 2222)
    GO
    INSERT [dbo].[usr_CUSTOMER] ([Last_Name], [First_Name], [Middle_Name], [ID]) VALUES (N'alex', N'levi', N'dolev', 33)
    GO
    INSERT [dbo].[usr_CUSTOMER] ([Last_Name], [First_Name], [Middle_Name], [ID]) VALUES (N'oren', N'cohen', N'ornini', 44444)
    GO
    INSERT [dbo].[usr_CUSTOMER] ([Last_Name], [First_Name], [Middle_Name], [ID]) VALUES (N'ron', N'ziyon', N'amir', 2222)
    GO
    ----------------------------script---------------------------------------------
    IF OBJECT_ID('tempdb..#TempString') IS NOT NULL 
    DROP TABLE #TempString
    IF OBJECT_ID('tempdb..#tempcount') IS NOT NULL 
    DROP TABLE #tempcount
    IF OBJECT_ID('tempdb..#tempcmbnition') IS NOT NULL 
    DROP TABLE #tempcmbnition
    --------------------------------------------------------------------------------
    --------------------------------------------------------------------------------
    SELECT  ID,
    [Last_Name] + '#' + [First_Name] + '#' + ISNULL([Middle_Name], '')  as StringRow 
    INTO #TempString  
    FROM [dbo].[usr_CUSTOMER]  
    ORDER BY StringRow
    select distinct id 
    into #tempcount
    from usr_CUSTOMER
    CREATE TABLE [dbo].[#tempcmbnition](
    [ID] [int] NULL,
    [combinedString] [nvarchar](max) NULL
    ) 
    --------------------------------------------------------------------------------
    --------------------------------------------------------------------------------
    DECLARE @tableID table(ID int)  
    insert into @tableID(ID) (select distinct Id from #tempcount)
    DECLARE @CNT int
    SET @CNT = (select count(*) from @tableID)
    declare @lastRow int
    --------------------------------------------------------------------------------
    --------------------------------------------------------------------------------
    WHILE (@CNT  >=1 )
    BEGIN       
    SET @lastRow = (SELECT TOP 1 id FROM #tempcount ORDER BY id DESC)
    DECLARE @combinedString VARCHAR(MAX) 
    set @combinedString = ''
    SELECT  @combinedString = COALESCE(@combinedString + '^ ', '') + StringRow
    from #TempString
    where ID = @lastRow
    insert into #tempcmbnition (ID, [combinedString]) values(@lastRow ,@combinedString)
    SET @CNT = @CNT-1
    DELETE #tempcount where ID = @lastRow
    END
    --------------------------------------------------------------------------------
    --------------------------------------------------------------------------------
    -- if you what remove first char
    --  UPDATE #tempcmbnition 
    --  SET combinedString = RIGHT(combinedString, LEN(combinedString) - 1)
    --------------------------------------------------------------------------------
    --------------------------------------------------------------------------------
    select *from #TempString
    select * from #tempcmbnition

    OriginalEl autor galgil

Dejar respuesta

Please enter your comment!
Please enter your name here