Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Требуется помощь в написании запроса  [new]
Kast2K
Member

Откуда: Санкт-Петербург
Сообщений: 520
Добрый день, коллеги!
Есть следующие таблицы:
CREATE TABLE [dbo].[WS_Points_data](
	[id_body] [uniqueidentifier] NOT NULL,
	[point_id] [uniqueidentifier] NOT NULL,
	[point_value] [float] NOT NULL,
	[point_OK] [tinyint] NOT NULL,
	[point_actiondate] [datetime] NOT NULL
)

CREATE TABLE [dbo].[WS_Points_info](
	[point_id] [uniqueidentifier] NOT NULL,
	[point_minimum] [float] NOT NULL,
	[point_maximum] [float] NOT NULL,
	[point_x] [float] NOT NULL,
	[point_y] [float] NOT NULL,
	[point_devicetype] [tinyint] NOT NULL,
	[point_active] [tinyint] NOT NULL,
	[point_deleted] [tinyint] NULL

CREATE TABLE [dbo].[WS_PointsQueue](
	[point_id] [uniqueidentifier] NOT NULL,
	[point_position] [int] NOT NULL,
	[point_devicetype] [tinyint] NOT NULL
)


Хочу сформировать запрос для выполнения следующего действия - получить все активные точки (point_active=1), соответствующие типу прибора (point_devicetype=N). В случае, если за заданный период времени данная точка использовалась, то вывести её последнее значение в последний момент времени, а если не использовалась, то вывести в последнее значение 0 или Null.

Результат данного запроса в дальнейшем будет обработан и отрисован на форме приложения.

Поясню, если, например, данному прибору (point_devicetype) соответствуют N точек, то я хочу их отобразить и заполнить 0(нулями) если в указанный период времени прибор не производил в них запись и значениями если производил. Но в случае записи я хочу брать последнее значение.

Прошу прощения за корявость изложения.
Очень, надеюсь, что мой вопрос понятен.

Пытался сделать так:
select 
      wpi.point_id, 
      wpi.point_minimum, 
      wpi.point_maximum, 
      wpi.point_x, 
      wpi.point_y, 
      wpi.point_active, 
      wpq.point_position,
      wpd.point_value
      ,MAX(wpd.point_actiondate)
      from WS_Points_info wpi 
      inner join WS_PointsQueue wpq on 
      wpi.point_id=wpq.point_id
      left join WS_Points_data wpd on
      wpd.point_id=wpi.point_id 
      where
      wpd.point_actiondate between '2014-10-07 16:30:00' and '2014-10-09 02:02:22.130' and   
      (wpi.point_active=1 and 
      wpi.point_deleted is null and  
      wpi.point_devicetype=0) 
      and wpd.id_body='63E3F9F0-8B4F-4CE3-A60B-D79D72753138'
         
      group by wpi.point_id, 
      wpi.point_minimum, 
      wpi.point_maximum, 
      wpi.point_x, 
      wpi.point_y, 
      wpi.point_active, 
      wpq.point_position,
      wpd.point_value
      order by wpq.point_position


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

Спасибо.

Никогда не бойся делать то, что не умеешь.
Помни, профессионалы построили Титаник, а Ковчег любители.
10 окт 14, 10:17    [16685675]     Ответить | Цитировать Сообщить модератору
 Re: Требуется помощь в написании запроса  [new]
Glory
Member

Откуда:
Сообщений: 104760
Kast2K
Поясню, если, например, данному прибору (point_devicetype) соответствуют N точек, то я хочу их отобразить и заполнить 0(нулями) если в указанный период времени прибор не производил в них запись и значениями если производил. Но в случае записи я хочу брать последнее значение.

Где пример исходных данных и желаемый результат для них ?
10 окт 14, 10:21    [16685695]     Ответить | Цитировать Сообщить модератору
 Re: Требуется помощь в написании запроса  [new]
Kast2K
Member

Откуда: Санкт-Петербург
Сообщений: 520
Glory,

WS_Points_Data

id_bodypoint_idpoint_valuepoint_OKpoint_actiondate
DA27B0F3-D4BC-43CF-BD8E-F88999072635303D8E49-49DF-412A-9EBF-6FFC96D187F7012014-10-08 16:01:52.723
63E3F9F0-8B4F-4CE3-A60B-D79D72753138303D8E49-49DF-412A-9EBF-6FFC96D187F7012014-10-08 16:02:19.130
63E3F9F0-8B4F-4CE3-A60B-D79D72753138303D8E49-49DF-412A-9EBF-6FFC96D187F7012014-10-08 17:02:18.130
63E3F9F0-8B4F-4CE3-A60B-D79D72753138303D8E49-49DF-412A-9EBF-6FFC96D187F7002014-10-08 17:02:22.130


WS_Points_Info
point_idpoint_minimumpoint_maximumpoint_xpoint_ypoint_devicetypepoint_activepoint_deleted
69B3C44E-BAE0-4283-AE24-0C4F7C82E894102.5106.318.238993710691840.384615384615400NULL
98E59062-B3EC-48E4-B427-210EB1C4AF5A00101001NULL
303D8E49-49DF-412A-9EBF-6FFC96D187F7100.5106.32.5157232704402515.384615384615401NULL
6D85D929-5790-4B0A-BA1B-A99FD423349600101001NULL


WS_PointsQueue
point_idpoint_positionpoint_devicetype
69B3C44E-BAE0-4283-AE24-0C4F7C82E894250
303D8E49-49DF-412A-9EBF-6FFC96D187F7270
98E59062-B3EC-48E4-B427-210EB1C4AF5A290
6D85D929-5790-4B0A-BA1B-A99FD4233496300


Сообщение было отредактировано: 10 окт 14, 10:33
10 окт 14, 10:26    [16685732]     Ответить | Цитировать Сообщить модератору
 Re: Требуется помощь в написании запроса  [new]
Kast2K
Member

Откуда: Санкт-Петербург
Сообщений: 520
желаемый результат:
point_idpoint_minimumpoint_maximumpoint_xpoint_ypoint_activepoint_positionpoint_value(No column name)
303D8E49-49DF-412A-9EBF-6FFC96D187F7100.5106.32.5157232704402515.384615384615412702014-10-08 17:02:22.130
98E59062-B3EC-48E4-B427-210EB1C4AF5A001010129NULLNULL
6D85D929-5790-4B0A-BA1B-A99FD4233496001010130NULLNULL


Сообщение было отредактировано: 10 окт 14, 10:34
10 окт 14, 10:31    [16685775]     Ответить | Цитировать Сообщить модератору
 Re: Требуется помощь в написании запроса  [new]
Glory
Member

Откуда:
Сообщений: 104760
Почему point_id в результате меньше, чем есть в исходных таблицах ?
10 окт 14, 10:36    [16685810]     Ответить | Цитировать Сообщить модератору
 Re: Требуется помощь в написании запроса  [new]
Kast2K
Member

Откуда: Санкт-Петербург
Сообщений: 520
Glory,

Т.к. я выбираю только те point_id, у которых параметр point_active=1
10 окт 14, 10:37    [16685822]     Ответить | Цитировать Сообщить модератору
 Re: Требуется помощь в написании запроса  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
Kast2K,

откуда взялись NULL в point_value , если для point_active=1 в WS_Points_Data там 0 ?
10 окт 14, 10:43    [16685863]     Ответить | Цитировать Сообщить модератору
 Re: Требуется помощь в написании запроса  [new]
Glory
Member

Откуда:
Сообщений: 104760
Тогда
select *
from WS_Points_Info a
inner join WS_PointsQueue b on a.point_id = b.point_id
left outer join (select point_id, max(point_actiondate) as point_actiondate from WS_Points_Data group point_id) c
on c.b.point_id = a.b.point_id
where a.point_active = 1
10 окт 14, 10:51    [16685943]     Ответить | Цитировать Сообщить модератору
 Re: Требуется помощь в написании запроса  [new]
Kast2K
Member

Откуда: Санкт-Петербург
Сообщений: 520
Glory,
Спасибо!!!

Конечно, можно получить желаемое сделав 2 запроса и в дальнейшем распарсить результаты, но это неинтересно :)
Хочется реализовать все в одном запросе.

Как планировалось изначально:

первым запросом получаю отсортированный список points
select
wpi.point_id
,wpi.point_minimum
,wpi.point_maximum
,wpi.point_x
,wpi.point_y
,wpq.point_position
from WS_Points_info wpi
inner join WS_PointsQueue wpq on
wpi.point_id=wpq.point_id
where wpi.point_active=1
order by wpq.point_position

результат
point_id point_minimum point_maximum point_x point_y point_position
303D8E49-49DF-412A-9EBF-6FFC96D187F7 100.5 106.3 2.51572327044025 15.3846153846154 27
98E59062-B3EC-48E4-B427-210EB1C4AF5A 0 0 10 10 29
6D85D929-5790-4B0A-BA1B-A99FD4233496 0 0 10 10 30


рисую элементы в приложении.

вторым получаю последние значения точек на данном приборе в указанный период времени
select
wpi.point_id
,wpi.point_minimum
,wpi.point_maximum
,wpi.point_x
,wpi.point_y
,wpq.point_position
,max( wpd.point_actiondate)
from WS_Points_info wpi
inner join WS_Points_data wpd on
wpd.point_id=wpi.point_id
inner join WS_PointsQueue wpq on
wpi.point_id=wpq.point_id
where wpd.point_actiondate between '2014-10-07 16:30:00' and '2014-10-09 02:02:22.130' and   
      (wpi.point_active=1 and 
      wpi.point_deleted is null and  
      wpi.point_devicetype=0) 
      and wpd.id_body='63E3F9F0-8B4F-4CE3-A60B-D79D72753138'
group by
wpi.point_id
,wpi.point_minimum
,wpi.point_maximum
,wpi.point_x
,wpi.point_y
,wpq.point_position
order by wpq.point_position


point_id point_minimum point_maximum point_x point_y point_position (No column name)
303D8E49-49DF-412A-9EBF-6FFC96D187F7 100.5 106.3 2.51572327044025 15.3846153846154 27 2014-10-08 17:02:22.130


проверяю соответствие полученного отображенному на форме и заполняю если найдено совпадение.
10 окт 14, 11:07    [16686096]     Ответить | Цитировать Сообщить модератору
 Re: Требуется помощь в написании запроса  [new]
Kast2K
Member

Откуда: Санкт-Петербург
Сообщений: 520
Glory,
Ещё раз СПАСИБО за помощь!
10 окт 14, 11:08    [16686099]     Ответить | Цитировать Сообщить модератору
 Re: Требуется помощь в написании запроса  [new]
Glory
Member

Откуда:
Сообщений: 104760
Kast2K
Конечно, можно получить желаемое сделав 2 запроса и в дальнейшем распарсить результаты, но это неинтересно :)
Хочется реализовать все в одном запросе.

Извиняюсь, а у меня сколько запросов ?
10 окт 14, 11:08    [16686101]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить