Dinámica de Columnas dinámicas en SQL Server


Tengo una tabla con el nombre de la Propiedad con las siguientes columnas en SQL Server:

Id    Name

hay alguna propiedad en esta tabla que cierto objeto en otra tabla debe dar valor a la misma.

Id    Object_Id    Property_Id    Value

Quiero hacer una tabla dinámica como el de abajo, que tiene una columna para cada propiedad, he declarado en 1’st tabla:

Object_Id    Property1    Property2    Property3    ...

Quiero saber ¿cómo puedo obtener columnas de pivote de forma dinámica a partir de la tabla. Debido a que las filas en 1’st tabla cambiará.

OriginalEl autor Ashkan | 2013-02-10

1 respuesta

  1. 13

    Algo como esto:

    DECLARE @cols AS NVARCHAR(MAX);
    DECLARE @query AS NVARCHAR(MAX);
    
    select @cols = STUFF((SELECT distinct ',' +
                            QUOTENAME(Name)
                          FROM property
                          FOR XML PATH(''), TYPE
                         ).value('.', 'NVARCHAR(MAX)') 
                            , 1, 1, '');
    
    SELECT @query =
    
    'SELECT *
    FROM
    (
      SELECT
        o.object_id,
        p.Name,
        o.value
      FROM propertyObjects AS o
      INNER JOIN property AS p ON o.Property_Id = p.Id
    ) AS t
    PIVOT 
    (
      MAX(value) 
      FOR Name IN( ' + @cols + ' )' +
    ' ) AS p ; ';
    
     execute(@query);

    SQL Violín Demo.

    Esto le dará algo como esto:

    | OBJECT_ID | PROPERTY1 | PROPERTY2 | PROPERTY3 | PROPERTY4 |
    -------------------------------------------------------------
    |         1 |        ee |        fd |       fdf |      ewre |
    |         2 |       dsd |       sss |      dfew |       dff |
    Gracias Pero otra pregunta. por qué escribió MAX(VALOR)?
    Usted tiene que usar una función de agregado para la dinamizada valores, he utilizado MAX como un trabajo alrededor.
    y la última pregunta! Hay alguna manera de que yo pueda convertir esto a algún tipo de vista? usted no puede utilizar Declarar… en vista. También traté de valor de la tabla de función. No pude hacer que funcione bien!
    Creo que la única manera es utilizar esta dentro de un procedimiento almacenado, puede ser que usted puede usar dentro de una tabla de valor de la función no estoy seguro de por la tarde.
    Muchas gracias Mahmoud!

    OriginalEl autor

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *