SQL Pivot создает NULL вместо слияния по значению DateTime - PullRequest
1 голос
/ 16 октября 2019

Мои необработанные данные выглядят так:

value   InsertedAt  timestamp   country model   ForecastRun origin  ID
10  2019-10-16 19:06:05.793 2019-10-11 21:00:00.000 Germany fundamentalmodel    3D8 manual  1065
10  2019-10-16 19:06:05.793 2019-10-11 22:00:00.000 Germany fundamentalmodel    3D8 manual  1066
10  2019-10-16 19:06:05.793 2019-10-11 23:00:00.000 Germany fundamentalmodel    3D8 manual  1067
13  2019-10-16 19:06:07.240 2019-10-11 21:00:00.000 France  fundamentalmodel    3D8 manual  1089
13  2019-10-16 19:06:07.240 2019-10-11 22:00:00.000 France  fundamentalmodel    3D8 manual  1090
13  2019-10-16 19:06:07.240 2019-10-11 23:00:00.000 France  fundamentalmodel    3D8 manual  1091

Я хочу поворачиваться на основе столбца 'страна'.

Это мой запрос:

SELECT timestamp, Germany, France
FROM dbo.Forecasts
PIVOT (
 AVG(value)
 FOR country IN (
    [Germany],
    [France])
) as pivot_table
ORDER BY timestamp DESC

Мой ожидаемый результат:

timestamp   Germany France
2019-10-11 23:00:00.000 10  13
2019-10-11 22:00:00.000 10  13
2019-10-11 21:00:00.000 10  13

Мой фактический результат:

timestamp   Germany France
2019-10-11 23:00:00.000 10  NULL
2019-10-11 23:00:00.000 NULL    13
2019-10-11 22:00:00.000 NULL    13
2019-10-11 22:00:00.000 10  NULL
2019-10-11 21:00:00.000 10  NULL
2019-10-11 21:00:00.000 NULL    13

Я попробовал свой запрос на разных данных, и он отлично работает. Однако не в этом конкретном случае. Чего мне не хватает?

Ответы [ 2 ]

0 голосов
/ 16 октября 2019
create table dbo.Forecasts
(
  value int not null,
  InsertedAt datetime not null,
  [timestamp] datetime not null,
  country varchar(100) not null,
  model varchar(100) not null,
  ForecastRun varchar(100) not null,
  origin varchar(100) not null,
  ID int not null
)
GO

insert into dbo.Forecasts
(value,InsertedAt,[timestamp],country,model,ForecastRun,origin,ID)
values
(10, '2019-10-16 19:06:05.793', '2019-10-11 21:00:00.000', 'Germany', 'fundamentalmodel', '3D8', 'manual',  1065)
,(10, '2019-10-16 19:06:05.793', '2019-10-11 22:00:00.000', 'Germany', 'fundamentalmodel', '3D8', 'manual',  1066)
,(10, '2019-10-16 19:06:05.793', '2019-10-11 23:00:00.000', 'Germany', 'fundamentalmodel', '3D8', 'manual',  1067)
,(13, '2019-10-16 19:06:07.240', '2019-10-11 21:00:00.000', 'France', 'fundamentalmodel', '3D8', 'manual',  1089)
,(13, '2019-10-16 19:06:07.240', '2019-10-11 22:00:00.000', 'France', 'fundamentalmodel', '3D8', 'manual',  1090)
,(13, '2019-10-16 19:06:07.240', '2019-10-11 23:00:00.000', 'France', 'fundamentalmodel', '3D8', 'manual',  1091)
GO


SELECT pt.[timestamp], pt.[Germany], pt.[France]
FROM (select f.value, f.[timestamp], f.country from dbo.Forecasts f) as x
PIVOT (
 AVG(x.value)
 FOR x.country IN (
    [Germany],
    [France])
) as pt
ORDER BY pt.[timestamp] DESC
GO

Результаты в

timestamp               Germany     France
----------------------- ----------- -----------
2019-10-11 23:00:00.000 10          13
2019-10-11 22:00:00.000 10          13
2019-10-11 21:00:00.000 10          13

(3 row(s) affected)

Где была проблема?

FROM dbo.Forecasts

Может быть вместо:

FROM (select f.value, f.[timestamp], f.country from dbo.Forecasts f) as x

Вы должны перечислить все столбцы, которые будут участвовать в совокупности, но не более того. Столбец ID связывался с агрегатом, поэтому каждая строка в исходной таблице помещала значение в результат. Если вы добавите f.ID в выборку, вы воспроизведете проблему.

0 голосов
/ 16 октября 2019

тот же SQL, который вы используете, прекрасно работает для меня в Oracle DB

with aa as (select 10 value, '2019-10-11 21:00:00.000' timestamp, 'Germany' country     
from dual union all
select 10 value, '2019-10-11 22:00:00.000' timestamp, 'Germany' country from dual     union all
select 10 value, '2019-10-11 23:00:00.000' timestamp, 'Germany' country from dual     union all
select 13 value, '2019-10-11 21:00:00.000' timestamp, 'France' country from dual     union all
select 13 value, '2019-10-11 22:00:00.000' timestamp, 'France' country from dual     union all
select 14 value, '2019-10-11 23:00:00.000' timestamp, 'France' country from dual
)
SELECT *
FROM aa
PIVOT (
 AVG(value)
 FOR country IN (
    'Germany',
    'France'))  pivot_table
ORDER BY timestamp DESC;
...