У меня такая таблица ...
CustomerID DBColumnName Data
--------------------------------------
1 FirstName Joe
1 MiddleName S
1 LastName Smith
1 Date 12/12/2009
2 FirstName Sam
2 MiddleName S
2 LastName Freddrick
2 Date 1/12/2009
3 FirstName Jaime
3 MiddleName S
3 LastName Carol
3 Date 12/1/2009
И я хочу это ...
Возможно ли это с помощью PIVOT?
CustomerID FirstName MiddleName LastName Date
----------------------------------------------------------------------
1 Joe S Smith 12/12/2009
2 Sam S Freddrick 1/12/2009
3 Jaime S Carol 12/1/2009
sql
sql-server
tsql
pivot
pivot-without-aggregate
ctrlShiftBryan
источник
источник
Да, но почему !!??
Select CustomerID, Min(Case DBColumnName When 'FirstName' Then Data End) FirstName, Min(Case DBColumnName When 'MiddleName' Then Data End) MiddleName, Min(Case DBColumnName When 'LastName' Then Data End) LastName, Min(Case DBColumnName When 'Date' Then Data End) Date From table Group By CustomerId
источник
Pivot
в своем запросе, затем переключился на это и посмотрел на план выполнения для одновременного запуска обоих. Этот подход стоил 8%, а метод Pivot - 92%!Warning: Null value is eliminated by an aggregate or other SET operation
WITH pivot_data AS ( SELECT customerid, -- Grouping Column dbcolumnname, -- Spreading Column data -- Aggregate Column FROM pivot2 ) SELECT customerid, [firstname], [middlename], [lastname] FROM pivot_data PIVOT (max(data) FOR dbcolumnname IN ([firstname],[middlename],[lastname])) AS p;
источник
SELECT
оператор под CTE мог просто указать имя исходной таблицы.Хорошо, извините за плохой вопрос. gbn направил меня на верный путь. Это то, что я искал в ответе.
SELECT [FirstName], [MiddleName], [LastName], [Date] FROM #temp PIVOT ( MIN([Data]) FOR [DBColumnName] IN ([FirstName], [MiddleName], [LastName], [Date]) )AS p
Затем мне пришлось использовать оператор while и построить приведенный выше оператор как varchar и использовать dynmaic sql.
Используя что-то вроде этого
SET @fullsql = @fullsql + 'SELECT ' + REPLACE(REPLACE(@fulltext,'(',''),')','') SET @fullsql = @fullsql + 'FROM #temp ' SET @fullsql = @fullsql + 'PIVOT' SET @fullsql = @fullsql + '(' SET @fullsql = @fullsql + ' MIN([Data])' SET @fullsql = @fullsql + ' FOR [DBColumnName] IN '+@fulltext SET @fullsql = @fullsql + ')' SET @fullsql = @fullsql + 'AS p' EXEC (@fullsql)
Наличие a для создания @fulltext с помощью цикла while и выбора отдельных имен столбцов из таблицы. Спасибо за ответы.
источник
SELECT main.CustomerID, f.Data AS FirstName, m.Data AS MiddleName, l.Data AS LastName, d.Data AS Date FROM table main INNER JOIN table f on f.CustomerID = main.CustomerID INNER JOIN table m on m.CustomerID = main.CustomerID INNER JOIN table l on l.CustomerID = main.CustomerID INNER JOIN table d on d.CustomerID = main.CustomerID WHERE f.DBColumnName = 'FirstName' AND m.DBColumnName = 'MiddleName' AND l.DBColumnName = 'LastName' AND d.DBColumnName = 'Date'
Изменить: я написал это без редактора и не запускал SQL. Надеюсь, вы поняли идею.
источник
OP на самом деле не нужно было поворачивать без агрегирования, но для тех из вас, кто пришел сюда, чтобы узнать, как увидеть:
sql параметризованный запрос cte
Ответ на этот вопрос связан с ситуацией, когда требуется pivot без агрегирования, поэтому пример его выполнения является частью решения.
источник
Попробуй это:
SELECT CUSTOMER_ID, MAX(FIRSTNAME) AS FIRSTNAME, MAX(LASTNAME) AS LASTNAME ... FROM ( SELECT CUSTOMER_ID, CASE WHEN DBCOLUMNNAME='FirstName' then DATA ELSE NULL END AS FIRSTNAME, CASE WHEN DBCOLUMNNAME='LastName' then DATA ELSE NULL END AS LASTNAME, ... and so on ... GROUP BY CUSTOMER_ID ) TEMP GROUP BY CUSTOMER_ID
источник
Это должно работать:
select * from (select [CustomerID] ,[Demographic] ,[Data] from [dbo].[pivot] ) as Ter pivot (max(Data) for Demographic in (FirstName, MiddleName, LastName, [Date]))as bro
источник
Вот отличный способ создать динамические поля для сводного запроса:
--суммировать значения в таблицу tmp
declare @STR varchar(1000) SELECT @STr = COALESCE(@STr +', ', '') + QUOTENAME(DateRange) from (select distinct DateRange, ID from ##pivot)d order by ID
--- увидеть созданные поля
источник