Tengo una tabla siguiente:

State   LAB GROUP   DATE    CODE    ID
UP  A   I   1-Jan   1   345
UP  R   S   1-Feb   1   456
UP  A   S   1-Jan   2   567
DL  R   S   1-Feb   3   678
DL  T   S   1-Jan   1   789
DL  A   S   1-Jan   2   900
MN  T   S   1-Jan   3   1011
MN  R   I   1-Feb   1   1122
MN  S   I   1-Feb   2   1233

Necesito una tabla dinámica del siguiente tipo:

STATE   A   R   T   TOTAL
UP  2   1   0   3
DL  1   1   1   3
MN  0   1   1   2

DISTINTOS RECUENTO DE NÚMERO DE IDENTIFICACIÓN PARA CADA LABORATORIO PARA CADA ESTADO.

Entonces necesitamos las tablas dinámicas, filtrada por las siguientes columnas:

GRUPO
FECHA
CÓDIGO

Así 1ª mesa tendrán la tabla dinámica por encima contando sólo los registros que tienen el GRUPO=S
2ª mesa tendrá la tabla dinámica por encima contando sólo los registros que se han de CÓDIGO=1

y así sucesivamente, quiero poner varias condiciones. y generar varias tablas una por una y de exportación.

Si esto es posible en SQL por favor hágamelo saber! Yo descartó vba de excel debido a que el tamaño de la tabla (tabla de origen se han de 800.000 registros aprox.).

InformationsquelleAutor user3218428 | 2014-01-28

4 Comentarios

  1. 2

    Prueba esto :-

    Select [State],[A],[R],[T],Total = [A] + [R]+ [T]
    from 
    (
        Select [State],
               [A] = Sum(Case when LAB='A' then 1 else 0 END) ,
               [R] = Sum(Case when LAB='R' then 1 else 0 END) ,
               [T] = Sum(Case when LAB='T' then 1 else 0 END) 
       from YourTable
       group by [State]
    )a

    SQL VIOLÍN

  2. 1
    CREATE TABLE #t(States VARCHAR(10),LAB VARCHAR(5),GROUPs VARCHAR(5),DATEs VARCHAR(10),CODE INT,ID INT)
    INSERT INTO #t values('UP','A','I','1-Jan',1,345)
    INSERT INTO #t values('UP','R','S','1-Feb',1,456)
    INSERT INTO #t values('UP','A','S','1-Jan',2,567)
    INSERT INTO #t values('DL','R','S','1-Feb',3,678)
    INSERT INTO #t values('DL','T','S','1-Jan',1,789)
    INSERT INTO #t values('DL','A','S','1-Jan',2,900)
    INSERT INTO #t values('MN','T','S','1-Jan',3,1011)
    INSERT INTO #t values('MN','R','I','1-Feb',1,1122)
    INSERT INTO #t values('MN','S','I','1-Feb',2,1233)
    SELECT States,ISNULL(A,0) A,ISNULL(R,0) R,ISNULL(T,0) T,ISNULL(A,0)+ISNULL(R,0)+ISNULL(T,0) total
    FROM 
    (
    SELECT States,LAB,Count(ID) AS cnt FROM #t GROUP BY States,LAB /*apply GROUP DATE CODE condition here*/ 
    ) AS PVT
    PIVOT(MAX(cnt) FOR LAB IN (A,R,T)) pvt
  3. 1

    Su tabla de ejemplo

    SELECT * INTO #TEMP FROM
    (               
    SELECT 'UP' [State],'A' LAB,'I' [GROUP],'1-Jan' [DATE],1 CODE,345 ID
    UNION ALL
    SELECT 'UP','R','S','1-Feb',1,456
    UNION ALL
    SELECT 'UP','A','S','1-Jan',2,567
    UNION ALL
    SELECT 'DL','R','S','1-Feb',3,678
    UNION ALL
    SELECT 'DL','T','S','1-Jan',1,789
    UNION ALL
    SELECT 'DL','A','S','1-Jan',2,900
    UNION ALL
    SELECT 'MN','T','S','1-Jan',3,1011
    UNION ALL
    SELECT 'MN','R','I','1-Feb',1,1122
    UNION ALL
    SELECT 'MN','S','I','1-Feb',2,1233  
    )TAB

    Ahora lo que necesita para obtener el recuento diferente de cada estado y obtener la suma como el resultado para mostrar Total
    en dinamizada resultado.

    SELECT DISTINCT [State],LAB,SUM(CNT) CNT 
    INTO #NEWTABLE
    FROM 
    (
    SELECT DISTINCT 
    [State],LAB,
    CASE WHEN [State] IS NULL THEN NULL ELSE COUNT([State]) OVER(PARTITION BY [State],LAB) END CNT  
    FROM #TEMP
    )TAB
    GROUP BY [State],LAB
    WITH ROLLUP

    Ahora necesitamos obtener las columnas distintas para el pivote(@cols) y columnas para identificar y reemplazar null con cero en el pivote(@NullToZeroCols)

    DECLARE @cols NVARCHAR (MAX)
    DECLARE @NullToZeroCols NVARCHAR (MAX)
    SET @cols = SUBSTRING((SELECT DISTINCT ',['+LAB+']' FROM #NEWTABLE GROUP BY LAB  FOR XML PATH('')),2,8000)
    SET @NullToZeroCols = SUBSTRING((SELECT DISTINCT ',ISNULL(['+LAB+'],0) AS ['+LAB+']' 
    FROM #NEWTABLE GROUP BY LAB FOR XML PATH('')),2,8000)

    Unirse a la pivotted consulta con el #TABLANUEVA para obtener el Total para cada Estado

    DECLARE @query NVARCHAR(MAX)
    SET @query = 'SELECT P.State,' + @NullToZeroCols + ',T2.CNT TOTAL FROM 
    (
    SELECT DISTINCT [State],LAB,CNT FROM #NEWTABLE
    ) x
    PIVOT 
    (
    SUM(CNT)
    FOR [LAB] IN (' + @cols + ')
    ) p
    JOIN #NEWTABLE T2 ON P.[STATE]=T2.[STATE] 
    WHERE P.State IS NOT NULL AND T2.LAB IS NULL AND T2.[STATE] IS NOT NULL;'
    EXEC SP_EXECUTESQL @query

    Aquí es el resultado de la

    ¿Cómo puedo obtener distinct COUNT en el pivote?

    Aquí es el SQLFiddle http://sqlfiddle.com/#!3/c2588/1 (Si se muestra cualquier error durante la carga de la página, simplemente haga clic en EJECUTARSQL, va a trabajar)

    Ahora bien, si usted desea obtener el resultado como usted dijo DISTINTOS RECUENTO DE número de IDENTIFICACIÓN PARA CADA LABORATORIO PARA CADA ESTADO, acaba de cambiar

    OVER(PARTITION BY [State],LAB)

    a

    OVER(PARTITION BY [State],LAB,Id)

    que se mostrará el siguiente resultado después de la ejecución de la dinámica de la consulta

    ¿Cómo puedo obtener distinct COUNT en el pivote?

  4. 0

    Otra solución mediante PIVOT :

    HTML:

    WITH PivotInUse AS (
    SELECT state,lab,COUNT(*) AS cnt
    FROM YourTable
    GROUP BY state,lab
    )
    SELECT STATE
    ,COALESCE([A], 0) AS A
    ,COALESCE([R], 0) AS R
    ,COALESCE([T], 0) AS T
    ,COALESCE([A], 0) + COALESCE([R], 0) + COALESCE([T], 0) AS TOTAL
    FROM PivotInUse
    PIVOT(SUM(cnt) FOR lab IN ([A],[R],[T])) AS p;

Dejar respuesta

Please enter your comment!
Please enter your name here