none
Tabla Cruzada RRS feed

  • Pregunta

  • Hola a todos...

    mi consulta es sobre tablas cruzadas. He estado viendo sobre este tema en el foro y por Internet, pero no logro realizar una consulta en la BBDD.

    Tengo la siguiente consulta SQL.

      SELECT DISTINCT 
            tbPedidos.compañia
          , tbClientes.NOMBRE
          , tbPedidos.altura1 as Altura
          ,(SELECT COUNT(p.altura1) FROM tbPedidos AS p WHERE ((p.altura1 = tbPedidos.altura1) and (p.altura1 > 0)) AND (p.compañia = tbClientes.CODIGO) AND (p.TipoDoc = 1)) as Uds
      FROM tbPedidos 
      INNER JOIN tbClientes ON tbPedidos.compañia = tbClientes.CODIGO
      WHERE tbPedidos.altura1 > 0
    UNION
      SELECT DISTINCT 
            tbPedidos.compañia
          , tbClientes.NOMBRE
          , tbPedidos.altura2 as Altura
          ,(SELECT COUNT(p.altura2) FROM tbPedidos AS p WHERE ((p.altura2 = tbPedidos.altura2) and (p.altura2 > 0)) AND (p.compañia = tbClientes.CODIGO) AND (p.TipoDoc = 1)) as Uds
      FROM tbPedidos 
      INNER JOIN tbClientes ON tbPedidos.compañia = tbClientes.CODIGO
      WHERE tbPedidos.altura2 > 0
    UNION
      SELECT DISTINCT 
           tbPedidos.compañia
          , tbClientes.NOMBRE
          , tbPedidos.altura3 as Altura
          ,(SELECT COUNT(p.altura3) FROM tbPedidos AS p WHERE ((p.altura3 = tbPedidos.altura3) and (p.altura3 > 0)) AND (p.compañia = tbClientes.CODIGO) AND (p.TipoDoc = 1)) as Uds
      FROM tbPedidos 
      INNER JOIN tbClientes ON tbPedidos.compañia = tbClientes.CODIGO
      WHERE tbPedidos.altura3 > 0
    
    ORDER BY tbClientes.NOMBRE, Altura

    con la siguiente salida en pantalla: 

    ¿como puedo hacer la consulta SQL para obtener el siguiente resultado?

    martes, 11 de septiembre de 2018 13:57

Respuestas

  • He conseguido parte de la consulta:

    declare @columnas varchar(max)
    
    set @columnas = ''
    
    select @columnas = coalesce(@columnas + '[' + cast(altura1 as varchar(7)) + '],', '')
       FROM (select distinct altura1 from tbPedidos) as DTM
    
    set @columnas = left(@columnas,LEN(@columnas)-1)
    
    DECLARE @SQLString nvarchar(max);
    
    set @SQLString = N'
        SELECT *
        FROM 
        (SELECT tbClientes.CODIGO, tbClientes.NOMBRE, altura1
            FROM tbPedidos INNER JOIN tbClientes ON compañia = tbClientes.CODIGO) AS SourceTable
        PIVOT
        (
        Count(altura1)
        FOR altura1 IN (' + @columnas + ')
        ) AS PivotTable;'
    
    EXECUTE sp_executesql @SQLString

    Pero solo con las alturas (1).

    ¿Alguien sabe como puedo incorporar las otras dos alturas?

    un saludo.


    • Editado rbs61 martes, 11 de septiembre de 2018 20:57
    • Marcado como respuesta Pablo RubioModerator miércoles, 12 de septiembre de 2018 16:39
    martes, 11 de septiembre de 2018 15:00