Amit Golan Ответов: 4

Сводная таблица Sql server


У меня есть таблица регистратора с меткой времени, именем тега и строками значений, которая автоматически регистрирует данные каждые 5 секунд для нескольких тегов.
Я хочу, чтобы выполнить запрос, который показывает данные, собранные в сводных показа - отметка времени, значение для значения tag1, tag2 значение,... значение для тега Н...
Может ли кто-нибудь порекомендовать мне Способ построения этого запроса для отображения данных?

Что я уже пробовал:

Я попытался найти справку в google и нашел только способ запустить сводный запрос с суммой/средним значением значений, но не представляя значения по метке времени.

ZurdoDev

Трудно понять, как помочь, не видя, как хранятся ваши данные и как вы хотите их представить. Нажмите кнопку улучшить вопрос и добавьте эту информацию, пожалуйста.

4 Ответов

Рейтинг:
1

Amit Golan

Спасибо за подсказку.

Имя существующей таблицы DATA_LOG и временных меток поля с типом данных datetime, поле point_id с Тип данных varchar и _val поля с varchar тип данных.
Мне нужно привести поле _val к типу данных float, поэтому я попробовал следующий запрос, и он не работает:

select * FROM DATA_LOG 
pivot(sum(cast(_VAL as float)) for point_id in ([1],[2],[3])) as tagvalue where timestamp >= DATEADD(day,-4,GetDate())

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


Richard Deeming

Если вы хотите ответить на решение, нажмите кнопку "есть вопрос или комментарий?" кнопка под этим решением.

НЕ опубликуйте свой ответ как новое "решение".

Рейтинг:
0

RossMW

Не зная вашей структуры данных, я предполагаю здесь, однако, я создал свою собственную ниже

CREATE TABLE [dbo].[Test](
	[dtime] [datetime] NULL,
	[tag] [int] NULL,
	[value] [int] NULL
) ON [PRIMARY]


Ваш регистратор хранит данные каждые 5 секунд, поэтому записи будут уникальными для данной даты и времени, и поэтому вы можете использовать среднее значение или сумму, и она все равно вернет фактическое значение, так что сводная точка будет выглядеть примерно так

select * from test pivot (sum(value) for tag in ([1],[2],[3])) as tagvalue where dtime > '2017-12-20'


Мои тестовые данные - это что-то вроде

dtime	tag	value
2017-12-20 11:30:00.000	1	2
2017-12-20 11:30:00.000	2	5
2017-12-20 11:30:00.000	3	8


и это даст результат
2017-12-20 11:30:00.000	2	5	8


Вы упоминаете метку времени, я предполагаю, что это поле datetime, а не поле timestamp, поскольку метки времени уникальны для каждой записи, и вы не сможете ее повернуть.


Рейтинг:
0

Bryian Tan

Вот пример того, как привести столбец, а затем повернуть его

DECLARE  @DATA_LOG TABLE(
	[timestamp] Datetime NULL,
	[point_id] VARCHAR(10) NULL,
	[_val] VARCHAR(10) NULL
)

INSERT INTO @DATA_LOG
	SELECT GETDATE()-1,	1, 2 UNION
	SELECT GETDATE()-1,	2, 5 UNION
	SELECT GETDATE()-1,	3, 8 

select * from (select [timestamp], [point_id],cast([_val] as int) as [_val] from @DATA_LOG) p 
 pivot(sum([_val]) for point_id in ([1],[2],[3])) as tagvalue where [timestamp] >= DATEADD(day,-4,GetDate())


Выход:
timestamp	            1	2	3
2017-12-18 23:44:29.703	2	5	8


Ссылка: Преобразование сводного запроса для Varchar(40) в int или Decimal[^]


Amit Golan

Спасибо тебе, Брайан, за помощь. Это работает просто отлично!!!

Bryian Tan

Пожалуйста.

Рейтинг:
0

Amit Kumar

Привет,
Следуйте приведенным ниже ссылкам.

</p?