Руководство по T-SQL - PullRequest
0 голосов
/ 05 мая 2011

У меня есть табличная функция в t-sql, которая возвращает разделенное значение на 3 записи по номеру задания.Так, например, типичный возврат будет

JobNumber SplitValue
J1         X1
J1         X2
J1         X3
J2         X1
J2         X2
J2         X3

в возвратах строк.

Однако я хотел бы повернуть набор результатов, чтобы у меня было

J1 X1 X2 X3 
J2 X1 X2 X3

Может кто-нибудь помочь?

Приветствия

Ответы [ 4 ]

2 голосов
/ 05 мая 2011

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

Select [J1],[J2],...
from (
 select JobNumber, SplitValue from tablename
) as sourcetable
PIVOT (
 Max(SplitValue) for JobNumber in ([J1],[J2],...)
) as PivotTable

К сожалению, это также означает, что вы должны жестко закодировать столбцы, если не используете DynamicSQL.Ознакомьтесь со справочником MSDN по Сводные и отстраненные таблицы .

0 голосов
/ 19 мая 2013

Попробуйте это:

Пример данных

select * into #tmp from (
    select 'J1' [JobNumber], 'X1' [SplitValue] union all
    select 'J1', 'X2' union all
    select 'J1', 'X3' union all
    select 'J2', 'X1' union all
    select 'J2', 'X2' union all
    select 'J2', 'X3') as t;

JobNumber SplitValue
J1         X1
J1         X2
J1         X3
J2         X1
J2         X2
J2         X3

Запрос

select [JobNumber], [X1] [col1], [X2] [col2], [X3] [col3]
from #tmp
pivot (
    max([SplitValue])
    for [SplitValue] in ([X1], [X2], [X3])
) as t

JobNumber   col1    col2    col3
J1          X1      X2      X3
J2          X1      X2      X3

SQL Fiddle

0 голосов
/ 05 мая 2011

Это моё решение вашей проблемы, которую я только что взломал. Без комментариев или чего-либо еще, я боюсь, но, надеюсь, это даст вам отправную точку.

со стартовым столом #Jobs вот так:

JobNumber SplitValue
--------- ----------
J1        X1
J1        X2
J1        X3
J2        X1
J2        X2
J2        X3

Вы получите вывод этого:

JobNumber col_0 col_1 col_2
--------- ----- ----- -----
J1        X1    X2    X3
J2        X1    X2    X3

Код:

CREATE TABLE #Jobs
(
    JobNumber varchar(2),
    SplitValue varchar(2)
)

INSERT INTO #Jobs (JobNumber, SplitValue) VALUES ('J1','X1')
INSERT INTO #Jobs (JobNumber, SplitValue) VALUES ('J1','X2')
INSERT INTO #Jobs (JobNumber, SplitValue) VALUES ('J1','X3')
INSERT INTO #Jobs (JobNumber, SplitValue) VALUES ('J2','X1')
INSERT INTO #Jobs (JobNumber, SplitValue) VALUES ('J2','X2')
INSERT INTO #Jobs (JobNumber, SplitValue) VALUES ('J2','X3')

SELECT * FROM #Jobs

DECLARE @ColumnsNeeded int

;WITH CountsTable AS
(
    SELECT COUNT(*) AS ColumnCount FROM #Jobs GROUP BY JobNumber
)
SELECT @ColumnsNeeded = MAX(ColumnCount) FROM CountsTable

DECLARE @Counter int
SET @Counter = 0

CREATE TABLE #Pivoted
(
    JobNumber varchar(2)
)
DECLARE @AddColumnCommandPre varchar(255)
DECLARE @AddColumnCommandPost varchar(255)
DECLARE @AddColumnCommand varchar(255)

SET @AddColumnCommandPre = 'ALTER TABLE #Pivoted ADD col_'
SET @AddColumnCommandPost = ' varchar(2)'

WHILE (@Counter < @ColumnsNeeded)
BEGIN
    SET @AddColumnCommand = @AddColumnCommandPre + CAST(@Counter as varchar(3)) + @AddColumnCommandPost
EXECUTE (@AddColumnCommand)
    SELECT @Counter = @Counter + 1
END

SELECT * INTO #JobsWithRowNum FROM #Jobs
ALTER TABLE #JobsWithRowNum ADD RowNum int IDENTITY(1,1)

CREATE CLUSTERED INDEX JobsWithRowNum_RowNum ON #JobsWithRowNum(RowNum)

DECLARE @RowCount int
SELECT @RowCount = COUNT(*) FROM #JobsWithRowNum

DECLARE @RowInsert varchar(255), @Columns varchar(255), @Data varchar(255)
DECLARE @LastJobNumber varchar(3), @CurrentJobNumber varchar(3)
DECLARE @ColumnCounter int

SET @RowInsert = 'INSERT INTO #Pivoted (JobNumber'
SET @Columns = ''
SELECT @LastJobNumber = JobNumber FROM #JobsWithRowNum WHERE RowNum = 1
SET @Data = ') VALUES (''' + @LastJobNumber

SET @Counter = 1
SET @ColumnCounter = 0
WHILE (@Counter <= @RowCount)
BEGIN
    SELECT @CurrentJobNumber = JobNumber FROM #JobsWithRowNum WHERE RowNum = @Counter
    IF @CurrentJobNumber <> @LastJobNumber
    BEGIN
        EXEC (@RowInsert + @Columns + @Data + ''')')
        SET @Data = ') VALUES (''' + @CurrentJobNumber
        SET @LastJobNumber = @CurrentJobNumber
        SET @ColumnCounter = 0
        SET @Columns = ''
    END

    SET @Columns = @Columns + ', col_' + CAST(@ColumnCounter AS varchar(3))
    SELECT @Data = @Data + ''', ''' + SplitValue FROM #JobsWithRowNum WHERE RowNum = @Counter

    SET @Counter = @Counter + 1
    SET @ColumnCounter = @ColumnCounter + 1
END

EXEC (@RowInsert + @Columns + @Data + ''')')

SELECT * FROM #Pivoted

DROP TABLE #JobsWithRowNum
DROP TABLE #Pivoted
DROP TABLE #Jobs
0 голосов
/ 05 мая 2011

Ваш образец данных довольно сложен для понимания, так как выглядит действительно общим. Как сказал Тим, версия SQL Server будет полезна.

Вот независимый от версии запрос, который предоставляет запрошенный вывод:

    DECLARE @A Table
(JobNumber varchar(2), SplitValue varchar(2))

INSERT INTO @A
SELECT 'J1', 'X1' UNION ALL
SELECT 'J1',  'X2' UNION ALL
SELECT 'J1',  'X3' UNION ALL
SELECT 'J2',  'X1' UNION ALL
SELECT 'J2', 'X2' UNION ALL
SELECT 'J2', 'X3'    
    SELECT JobNumber
        ,(SELECT 'X1') as [X1]
        ,(SELECT 'X2') as [X2]
        ,(SELECT 'X3') as [X3]
    FROM @A
    GROUP BY JobNumber

Но я не уверен, что это окажет большую помощь в реальном мире, кроме как показать вам, как построить сводную область, используя подзапросы. Лучшие данные = лучший пример.

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