Как я могу повернуть несколько столбцов значений одновременно? - PullRequest
1 голос
/ 15 октября 2019

У меня есть таблица в SQL Server, которая выглядит следующим образом:

| EntityId | AttributeName | ValueSource | ValueText      |
|----------|---------------|-------------|----------------|
| 1        | Name          | Customer    | John Smith     |
| 1        | Age           | Customer    | 25             |
| 1        | Address       | Lookup      | 123 Main St    |
| 2        | Name          | Customer    | Jane Doe       |
| 2        | Age           | Customer    | 30             |
| 2        | Address       | Customer    | 1 Example Road |

А именно, помимо стандартных столбцов EAV, в ней также есть столбец метаданных о значении.

Моя цель здесь состоит в том, чтобы развернуть таблицу в реляционном формате по следующим строкам:

| EntityId | Name       | NameSource | Age | AgeSource | Address        | AddressSource |
|----------|------------|------------|-----|-----------|----------------|---------------|
| 1        | John Smith | Customer   | 25  | Customer  | 123 Main St    | Lookup        |
| 2        | JaneDoe    | Customer   | 30  | Customer  | 1 Example Road | Customer      |

Однако я довольно новичок в сводках T-SQL, и хотя могу выполнять стандартную сводку, игнорируяValueSource, я не могу заставить и 1010 *, и ValueText развернуться в результирующей таблице. Я надеялся

SELECT EntityId, val.Name, val.Age, val.Address, src.Name AS NameSource, src.Age AS AgeSource, src.Address AS AddressSource
FROM #PivotExample
PIVOT (MAX (ValueText) FOR AttributeName IN (Name, Age, Address)) AS val
PIVOT (MAX (ValueSource) FOR AttributeName IN (Name, Age, Address)) AS src;

, но это просто говорит мне, что AttributeName - это недопустимое имя столбца во втором стержне, и я не уверен, куда идти дальше.

Ответы [ 2 ]

3 голосов
/ 15 октября 2019

Вот рабочий пример опции PIVOT

Пример (или dbFiddle)

Select *
 From  (
        Select A.EntityID
              ,B.*
          From YourTable A
          Cross Apply ( values (AttributeName,ValueText)
                              ,(AttributeName+'Source',ValueSource)
                      ) B(Item,Value)
       ) src
 Pivot (max(Value) for Item in ( [Name],[NameSource],[Age],[AgeSource],[Address],[AddressSource] ) ) pvt

Пример

enter image description here

1 голос
/ 15 октября 2019

Как предлагается в комментариях, перекрестные запросы предоставляют более гибкий способ поворота:

SELECT EntityId
, MAX(IIF(AttributeName = 'Name', ValueText,NULL) AS Name
, MAX(IIF(AttributeName = 'Name', ValueSource,NULL) AS NameSource
, MAX(IIF(AttributeName = 'Age', ValueText,NULL) AS Age
, MAX(IIF(AttributeName = 'Age', ValueSource,NULL) AS AgeSource
, MAX(IIF(AttributeName = 'Address', ValueText,NULL) AS Address
, MAX(IIF(AttributeName = 'Address', ValueSource,NULL) AS AddressSource
FROM #PivotExample
GROUP BY EntityID;
...