Сводная таблица с одной строкой и четырьмя столбцами - PullRequest
0 голосов
/ 14 февраля 2012
 -- Pivot table with one row and four columns

SELECT 'Values' tValues, 
    ID,Name,ValueID,Value FROM (

        Select ID,Name,ValueID,Value FROM Table WHERE OptionID = 1000000

    ) AS SourceTable 

    PIVOT ( 

        COUNT(tValues)
        FOR tValues IN ( ID,Attribute,ValueID,Value ) 

    ) AS PivotTable;

Я приведу пример на сайте Microsoft.com: http://msdn.microsoft.com/en-us/library/ms177410.aspx

Но в Pivot есть несколько вещей, которые я не совсем понимаю, поэтому не удивляйтесь, когда вы увидите это в приведенном выше коде, например COUNT(tValues), я не знаю, для чего это, судя из примера на Microsoft, кажется, что это всегда какое-то числовое значение, поэтому я решил, что попробую проверить, вернет ли оно что-нибудь, но все, что он возвращает - это ошибка. В любом случае, если кто-то может рассказать, почему этот запрос не работает, и, возможно, объяснить, для чего используется числовое значение над FOR?

Table содержит количество строк x с четырьмя столбцами, поэтому оно выглядит следующим образом:

 ID  |  Name   |  ValueID  |  Value

 100 |  Color  |  10000    |  Black
 101 |  Size   |  10005    |  Large

Вывод должен быть таким:

 Name_100  |  Color   |  Name_101  |  Size  |

 10000     |  Black   |  10005     |  Large |

Ответы [ 2 ]

1 голос
/ 14 февраля 2012

Нечто подобное может быть.

Это будет работать только в том случае, если имя столбца уникально . Если нет, то вы можете добавить к нему идентификатор.

Итак, сначала некоторые тестовые данные:

CREATE TABLE tblValues
    (
        ID INT,
        Name VARCHAR(100),
        ValueID INT, 
        Value VARCHAR(100)
    )

INSERT INTO tblValues
VALUES
    (100,'Color',10000,'Black'),
    (101,'Size',10005,'Large')

Тогда вам нужно получить столбцы для поворота:

DECLARE @cols VARCHAR(MAX)
;WITH CTE AS
(
    SELECT
        'Name_'+CAST(tbl.ID AS VARCHAR(100)) AS Name,
        'Name_'+CAST(tbl.ID AS VARCHAR(100)) AS Sort,
        tbl.ID
    FROM
        tblValues AS tbl
    UNION ALL
    SELECT
        tbl.Name,
        'Value_'+CAST(tbl.ID AS VARCHAR(100)) AS Sort,
        tbl.ID
    FROM
        tblValues AS tbl
)
SELECT
    @cols = COALESCE(@cols + ','+QUOTENAME(Name),
                 QUOTENAME(Name))
FROM
    CTE
ORDER BY
    CTE.ID,
    CTE.Sort

Затем объявляем и выполняем динамический sql следующим образом:

DECLARE @query NVARCHAR(4000)=
N'SELECT
    *
FROM
(
    SELECT
        ''Name_''+CAST(tbl.ID AS VARCHAR(100)) AS pivotName,
        CAST(tbl.ValueID AS VARCHAR(100)) AS name
    FROM
        tblValues AS tbl
    UNION ALL
    SELECT
        tbl.Name AS pivotName,
        tbl.Value AS name
    FROM
        tblValues AS tbl
) AS p
PIVOT
(
    MAX(name)
    FOR pivotName IN ('+@cols+')
) AS pvt'

EXECUTE(@query)

Тогда в моем случае я отброшу созданную мной таблицу.

DROP TABLE tblValues

Редактировать

Или в вашем случае это должно быть примерно так:

Первые столбцы:

DECLARE @cols VARCHAR(MAX)
;WITH CTE AS
(
    SELECT
        'Name_'+CAST(tbl.ID AS VARCHAR(100)) AS Name,
        'Name_'+CAST(tbl.ID AS VARCHAR(100)) AS Sort,
        tbl.ID
    FROM
        [Table] AS tbl
    WHERE
        tbl.OptionID = 1000000
    UNION ALL
    SELECT
        tbl.Name,
        'Value_'+CAST(tbl.ID AS VARCHAR(100)) AS Sort,
        tbl.ID
    FROM
        [Table] AS tbl
    WHERE
        tbl.OptionID = 1000000
)
SELECT
    @cols = COALESCE(@cols + ','+QUOTENAME(Name),
                 QUOTENAME(Name))
FROM
    CTE
ORDER BY
    CTE.ID,
    CTE.Sort

Тогда динамический sql.

DECLARE @query NVARCHAR(4000)=
N'SELECT
    *
FROM
(
    SELECT
        ''Name_''+CAST(tbl.ID AS VARCHAR(100)) AS pivotName,
        CAST(tbl.ValueID AS VARCHAR(100)) AS name
    FROM
        [Table] AS tbl
    WHERE
        tbl.OptionID = 1000000
    UNION ALL
    SELECT
        tbl.Name AS pivotName,
        tbl.Value AS name
    FROM
        [Table] AS tbl
    WHERE
        tbl.OptionID = 1000000
) AS p
PIVOT
(
    MAX(name)
    FOR pivotName IN ('+@cols+')
) AS pvt'

EXECUTE(@query)

Вам не нужно создавать таблицу или отбрасывать ее. Это было только потому, что у меня не было вашей таблицы в моей базе данных, и что если кто-то еще захочет запустить пример.

1 голос
/ 14 февраля 2012

Если вы хотите использовать сводные таблицы с переменным числом столбцов, то я бы предложил использовать что-то вроде:

   DECLARE @cols VARCHAR(4000)
   DECLARE @query VARCHAR(8000)
   SELECT  @cols = STUFF(( SELECT DISTINCT
            '],[' + Name
                       FROM    Table
                       ORDER BY '],[' + Name
                       FOR XML PATH('')
                     ), 1, 2, '') + ']'

   SET @query =
   'SELECT * FROM
   (
        SELECT col1, col2, col3, whateverColYourInterestedIn, Name, Value
        FROM Table
   )t
   PIVOT (MAX(Value) FOR Name
   IN ('+@cols+')) AS pvt'

   EXECUTE (@query)

Возможно, это не совсем правильно, но, надеюсь, это станет отправной точкой для вас.

Для получения дополнительной информации, проверьте ссылки, такие как это или это .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...