Использование pivot в одном операторе select - PullRequest
1 голос
/ 26 мая 2019

У меня есть таблица со столбцами:

[Date]       [Name]     [Result]
2010-01-01   Name01     11
2010-01-01   Name02     22
2010-07-04   Name01     32
2010-07-04   Name02     54

Я работаю над оператором SELECT, который дает мне такой результат:

[Name]  [2010-01-01] [2010-07-04]
Name01       11           32
Name02       22           54

Я пробовал функцию PIVOT, но она не работает.

ВЫБРАТЬ * ИЗ (

SELECT Date,Name,Result
FROM tbl_Results
WHERE (..conditions..)
)
PIVOT (
Result FOR Date in
([1],[2],[3],[2],[5])
)

Сообщение об ошибке

Неверный синтаксис рядом с ключевым словом "PIVOT".

Это SQL Server 2005, я не уверен, что PIVOT доступен?

Может быть, использовать любую другую функцию?

Также я не знаю, как установить имя столбца в качестве даты из выбора.

UPDATE

Спасибо за все ответы. Проблема в том, что я не знаю, сколько столбцов будет в результате. Поэтому я не могу использовать значения с фиксированными датами, такие как «2010-07-04». Дата используется «на лету» в выписке из таблицы.

Ответы [ 3 ]

2 голосов
/ 26 мая 2019

Просто используйте условное агрегирование:

select name,
       max(case when date = '2010-01-01' then result end) as result_20100101,
       max(case when date = '2010-07-04' then result end) as result_20100704
from tbl_results
where . . . 
group by name;

Затем обновите систему до поддерживаемой базы данных.

1 голос
/ 26 мая 2019

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

Пример

Exec [prc-Pivot] '#YourTable','Date','sum([Result])[]','Name','count(*)[Records],min(Result)[MinValue],max(Result)[MaxValue]'

Или просто как

Exec [prc-Pivot] '#YourTable','Date','sum([Result])[]','Name',null

Возвращает

enter image description here

Хранимая процедура

CREATE PROCEDURE [dbo].[prc-Pivot] (
    @Source varchar(1000),          -- Any Table or Select Statement
    @PvotCol varchar(250),          -- Field name or expression ie. Month(Date)
    @Summaries varchar(250),        -- aggfunction(aggValue)[optionalTitle]
    @GroupBy varchar(250),          -- Optional additional Group By 
    @OtherCols varchar(500) )       -- Optional Group By or aggregates
AS

Set NoCount On
Set Ansi_Warnings Off

Declare @Vals varchar(max),@SQL varchar(max);
Set @Vals = ''
Set @OtherCols= IsNull(', ' + @OtherCols,'')
Set @Source = case when @Source Like 'Select%' then @Source else 'Select * From '+@Source end
Create Table #TempPvot  (Pvot varchar(100))
Insert Into #TempPvot
Exec ('Select Distinct Convert(varchar(100),' + @PvotCol + ') as Pvot FROM (' + @Source + ') A')
Select @Vals = @Vals + ', isnull(' + Replace(Replace(@Summaries,'(','(CASE WHEN ' + @PvotCol + '=''' + Pvot +  ''' THEN '),')[', ' END),0) As [' + Pvot ) From #TempPvot Order by Pvot
Drop Table #TempPvot
Set @SQL = Replace('Select ' + Isnull(@GroupBy,'') + @OtherCols + @Vals + ' From (' + @Source + ') PvtFinal ' + case when Isnull(@GroupBy,'')<>'' then 'Group By ' + @GroupBy + ' Order by ' + @GroupBy else '' end,'Select , ','Select ')
--Print @SQL
Exec (@SQL)


Set NoCount Off
Set Ansi_Warnings on
0 голосов
/ 26 мая 2019

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

SELECT *  FROM
(
    SELECT A.Name,A.Date,A.Result 
    FROM your_table A
    --WHERE A.Name = 'Name01'
) A
PIVOT
(
    SUM(Result)
    FOR Date IN ([2010-01-01],[2010-07-04])
)PVT
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...