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 Comentario

  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

Dejar respuesta

Please enter your comment!
Please enter your name here