Выберите строки для столбцов из таблицы - PullRequest
1 голос
/ 04 мая 2020

Как просто выбрать строки из столбца VALUE, чтобы получить двумерную таблицу с 6 столбцами и 2 строками.

Ниже приведена исходная таблица:

RowsToCoulms

Ответы [ 2 ]

0 голосов
/ 04 мая 2020

Вот решение с использованием SQL Pivot.

Как создать пример набора данных:

IF OBJECT_ID('SourceTable') Is Not Null Drop Table SourceTable
Create Table SourceTable (
    COL_IDX int,
    ROW_IDX int,
    VALUE nvarchar(100)
)
Insert into SourceTable (COL_IDX, ROW_IDX, VALUE)
Values 
     (1,1,'after 45 min')
    ,(2,1,'98')
    ,(3,1,'95')
    ,(4,1,'99')
    ,(5,1,'1.1')
    ,(6,1,'12')
    ,(1,2,'after 60 min')
    ,(2,2,'98')
    ,(3,2,'96')
    ,(4,2,'101')
    ,(5,2,'1.4')
    ,(6,2,'12')

Как выполнить поворот данных:

SELECT ROW_IDX AS MyIndex, [1],[2],[3],[4],[5],[6]
FROM 
    (SELECT * FROM SourceTable) AS q
PIVOT (
    MAX(Value)
    FOR COL_IDX IN ([1],[2],[3],[4],[5],[6])
) AS PivotedTable

Результат:

MyIndex    1            2   3   4   5   6
1          after 45 min 98  95  99  1.1 12
2          after 60 min 98  96  101 1.4 12

Сводка в SQL используется агрегатная функция; здесь я использовал «max», но это на самом деле не имеет значения, потому что для комбинации ROW_IDX / COL_IDX нет нескольких значений.

Похоже, вам может понадобиться динамически генерировать ваши столбцы, и в этом случае вы можете использовать Dynami c SQL, чтобы получить тот же результат:

DROP TABLE IF EXISTS #headings
SELECT DISTINCT COL_IDX='[' + Cast(COL_IDX AS NVARCHAR(6)) + ']' 
INTO #headings
FROM SourceTable 

DECLARE @Columns nvarchar(1000) = (SELECT string_agg(COL_IDX, ', ') FROM #headings)

DECLARE @MyCommand nvarchar(max) =
    'SELECT *
    FROM SourceTable
    PIVOT (
        MAX(VALUE)
        FOR COL_IDX IN (~Columns~) 
    ) PivotTable' 

SET @MyCommand = Replace(@MyCommand, '~Columns~', @Columns)
EXEC (@MyCommand)
DROP TABLE IF EXISTS #headings
0 голосов
/ 04 мая 2020

Типичным решением для поворота таблицы по фиксированному набору столбцов является использование условного агрегирования:

select
    row_idx,
    max(case when col_idx = 1 then value end) col1,
    max(case when col_idx = 2 then value end) col2,
    max(case when col_idx = 3 then value end) col3,
    max(case when col_idx = 4 then value end) col4,
    max(case when col_idx = 5 then value end) col5,
    max(case when col_idx = 6 then value end) col6
from mytable
group by row_idx
order by row_idx
...