Я две таблицы: VALUES1_TABLE для хранения значений и PARAM1_TABLE для определения параметров магазина:Удалить дубликаты полей с нулем в PIVOT построить
CREATE TABLE VALUES1_TABLE
([ID] int ,
[Date] DATETIME ,
[Value] float);
GO
DECLARE @dt DATETIME;
SET @dt=CONVERT(DATETIME, '2017-01-26 08:00:00.000', 121);
INSERT INTO VALUES1_TABLE VALUES (100, @dt , 200.09);
SET @dt=CONVERT(DATETIME, '2017-01-26 08:00:03.450', 121);
INSERT INTO VALUES1_TABLE VALUES (100, @dt, 201.01);
SET @dt=CONVERT(DATETIME, '2017-01-26 08:00:06.000', 121);
INSERT INTO VALUES1_TABLE VALUES (100, @dt, 200.85);
SET @dt=CONVERT(DATETIME, '2017-01-26 08:00:09.000', 121);
INSERT INTO VALUES1_TABLE VALUES (100, @dt, 200.12);
SET @dt=CONVERT(DATETIME, '2017-01-26 08:00:12.450', 121);
INSERT INTO VALUES1_TABLE VALUES (100, @dt, 201.02);
SET @dt=CONVERT(DATETIME, '2017-01-26 08:00:15.000', 121);
INSERT INTO VALUES1_TABLE VALUES (100, @dt, 200.45);
SET @dt=CONVERT(DATETIME, '2017-01-26 08:03:00.000', 121);
INSERT INTO VALUES1_TABLE VALUES (100, @dt , 200.19);
SET @dt=CONVERT(DATETIME, '2017-01-26 08:03:03.000', 121);
INSERT INTO VALUES1_TABLE VALUES (100, @dt, 201.54);
SET @dt=CONVERT(DATETIME, '2017-01-26 08:03:06.000', 121);
INSERT INTO VALUES1_TABLE VALUES (100, @dt, 200.95);
SET @dt=CONVERT(DATETIME, '2017-01-26 08:03:09.000', 121);
INSERT INTO VALUES1_TABLE VALUES (100, @dt, 200.12);
SET @dt=CONVERT(DATETIME, '2017-01-26 08:03:12.000', 121);
INSERT INTO VALUES1_TABLE VALUES (100, @dt, 201.82);
SET @dt=CONVERT(DATETIME, '2017-01-26 08:03:15.000', 121);
INSERT INTO VALUES1_TABLE VALUES (100, @dt, 201.45);
SET @dt=CONVERT(DATETIME, '2017-01-26 08:00:00.000', 121);
INSERT INTO VALUES1_TABLE VALUES (101, @dt, 50);
SET @dt=CONVERT(DATETIME, '2017-01-26 08:00:03.450', 121);
INSERT INTO VALUES1_TABLE VALUES (101, @dt, 51);
SET @dt=CONVERT(DATETIME, '2017-01-26 08:00:06.000', 121);
INSERT INTO VALUES1_TABLE VALUES (101, @dt, 50.5);
SET @dt=CONVERT(DATETIME, '2017-01-26 08:00:09.000', 121);
INSERT INTO VALUES1_TABLE VALUES (101, @dt, 51);
SET @dt=CONVERT(DATETIME, '2017-01-26 08:00:12.450', 121);
INSERT INTO VALUES1_TABLE VALUES (101, @dt, 52);
SET @dt=CONVERT(DATETIME, '2017-01-26 08:00:15.000', 121);
INSERT INTO VALUES1_TABLE VALUES (101, @dt, 52.5);
SET @dt=CONVERT(DATETIME, '2017-01-26 08:03:00.000', 121);
INSERT INTO VALUES1_TABLE VALUES (101, @dt, 50.5);
SET @dt=CONVERT(DATETIME, '2017-01-26 08:03:03.000', 121);
INSERT INTO VALUES1_TABLE VALUES (101, @dt, 51.5);
SET @dt=CONVERT(DATETIME, '2017-01-26 08:03:06.000', 121);
INSERT INTO VALUES1_TABLE VALUES (101, @dt, 51.5);
SET @dt=CONVERT(DATETIME, '2017-01-26 08:03:09.000', 121);
INSERT INTO VALUES1_TABLE VALUES (101, @dt, 51.5);
SET @dt=CONVERT(DATETIME, '2017-01-26 08:03:12.000', 121);
INSERT INTO VALUES1_TABLE VALUES (101, @dt, 51);
SET @dt=CONVERT(DATETIME, '2017-01-26 08:03:15.000', 121);
INSERT INTO VALUES1_TABLE VALUES (101, @dt, 52.1);
CREATE TABLE PARAM1_TABLE
([ID] int ,
[Name] NVARCHAR(20));
GO
INSERT INTO PARAM1_TABLE VALUES (100, 'Param1');
INSERT INTO PARAM1_TABLE VALUES (101, 'Param2');
Я хочу, чтобы получить значение AVG для каждого параметра для 3-минутного интервала , в течение 1 часа или 1 дня. Я написал T-SQL с инструкцией PIVOT, но я повторял поля с значениями NULL для каждого параметра. Код кода:
DROP TABLE #t;
GO
DECLARE @dt_st DATETIME
DECLARE @dt_end DATETIME
DECLARE @dt_allend DATETIME
CREATE TABLE #t (dt_st DATETIME, dt_end DATETIME)
SET @dt_st = CONVERT(DATETIME, '2017-01-26 07:00:00.000',121);
SET @dt_end = CONVERT(DATETIME, '2017-01-26 07:03:00.000',121);
SET @dt_allend = CONVERT(DATETIME, '2017-01-26 08:03:00.000',121);
WHILE (@dt_st < @dt_allend)
BEGIN
INSERT INTO #t VALUES(@dt_st, @dt_end);
--PRINT FORMAT(@dt_st, 'dd/MM/yyyy HH:mm:ss.fff', 'ru-RU') + ' ' + FORMAT(@dt_end, 'dd/MM/yyyy HH:mm:ss.fff', 'ru-RU');;
SET @dt_st = DATEADD(MINUTE, 3, @dt_st);
SET @dt_end = DATEADD(MINUTE, 3, @dt_end);
END
SELECT * FROM (
SELECT CONVERT(NVARCHAR(30),tm.dt_st, 121) + ' - ' + CONVERT(NVARCHAR(30),tm.dt_end, 121) AS [Time], d.[Value] AS [VALUE], [d].[ID] AS [ID], dev.Name AS [NAME]
FROM #t tm
LEFT JOIN [dbo].[VALUES1_TABLE] d ON
[d].[Date] >= dt_st AND d.[Date] < dt_end
INNER JOIN [dbo].[PARAM1_TABLE] dev
ON dev.id = d.[ID]
WHERE d.[ID] IN (100, 101)
) innerQuery
PIVOT (AVG([VALUE]) FOR [NAME] IN ([Param1], [Param2])
) AS PivotTable
Как удалить поля со значениями NULL и нормализовать выход?
Обновление1. Я хочу удалить повторяющиеся строки для каждого временного интервала. См. - http://sqlfiddle.com/#!3/1a208/7
Обновление 2. Я хочу значение AVG для каждого параметра в 3-минутном интервале. С кодом выше Я этот вывод:
Time ID Param1 Param2
2017-01-26 08:00:00.000 - 2017-01-26 08:03:00.000 100 200.59 NULL
2017-01-26 08:00:00.000 - 2017-01-26 08:03:00.000 101 NULL 51.1666666666667
But I want some other output:
Time Param1 Param2
2017-01-26 08:00:00.000 - 2017-01-26 08:03:00.000 200.59 51.1666666666667
и нужно вместо нулевой замены с нулевым – Chanukya
@Chanukya Нет, см скрипку пример - HTTP: // sqlfiddle. com/#! 3/1a208/7 – amaranth
, пожалуйста, опубликуйте свой результат. @ amarnath – Chanukya