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

Откуда:
Сообщений: 581
есть запрос

select objectname, countername, dbo.summary_sql.CounterValue, convert(datetime,substring (dbo.summary_sql.CounterDateTime,1,19),0) 
from dbo.summary_sql with (NOLOCK), dbo.CounterDetails with (NOLOCK)
where dbo.summary_sql.counterid =dbo.CounterDetails.CounterID
and MachineName=@server
and objectname=@obj 
and countername=@cname
and convert(datetime,substring (dbo.summary_sql.CounterDateTime,1,19),0)  between @date_at and @date_to
order by dbo.summary_sql.CounterDateTime

надо чтобы он обьеднялся с таким же запросом , т.е. создавалась одно большая таблица но вторая её часть таблицы была с другими параметрами @date_at @date_to
25 июн 09, 17:27    [7344562]     Ответить | Цитировать Сообщить модератору
 Re: Помогите написать запрос с JOIN  [new]
Glory
Member

Откуда:
Сообщений: 104760
И откуда начинается эта "вторая часть таблицы" ?
25 июн 09, 17:30    [7344578]     Ответить | Цитировать Сообщить модератору
 Re: Помогите написать запрос с JOIN  [new]
проходящий.
Guest
Kirillich
where dbo.summary_sql.counterid =dbo.CounterDetails.CounterID
and MachineName=@server
and objectname=@obj
and countername=@cname
and convert(datetime,substring (dbo.summary_sql.CounterDateTime,1,19),0) between @date_at and @date_to
order by dbo.summary_sql.CounterDateTime

надо чтобы он обьеднялся с таким же запросом , т.е. создавалась одно большая таблица но вторая её часть таблицы была с другими параметрами @date_at @date_to
И при чем тут join? Может таки union? Вроде как он нужен для такого объединения?
25 июн 09, 17:30    [7344582]     Ответить | Цитировать Сообщить модератору
 Re: Помогите написать запрос с JOIN  [new]
Паганель
Member

Откуда: Винница
Сообщений: 22552
Автор, а зачем
Kirillich
substring
?
25 июн 09, 17:33    [7344596]     Ответить | Цитировать Сообщить модератору
 Re: Помогите написать запрос с JOIN  [new]
как-то так
Guest
SELECT a.*, b.* 
FROM

(select objectname, countername, dbo.summary_sql.CounterValue, convert(datetime,substring (dbo.summary_sql.CounterDateTime,1,19),0) 
from dbo.summary_sql with (NOLOCK), dbo.CounterDetails with (NOLOCK)
where dbo.summary_sql.counterid =dbo.CounterDetails.CounterID
and MachineName=@server
and objectname=@obj 
and countername=@cname
and convert(datetime,substring (dbo.summary_sql.CounterDateTime,1,19),0)  between @date_at1 and @date_to1
order by dbo.summary_sql.CounterDateTime) a

FULL OUTER JOIN

(select objectname, countername, dbo.summary_sql.CounterValue, convert(datetime,substring (dbo.summary_sql.CounterDateTime,1,19),0) 
from dbo.summary_sql with (NOLOCK), dbo.CounterDetails with (NOLOCK)
where dbo.summary_sql.counterid =dbo.CounterDetails.CounterID
and MachineName=@server
and objectname=@obj 
and countername=@cname
and convert(datetime,substring (dbo.summary_sql.CounterDateTime,1,19),0)  between @date_at and @date_to
order by dbo.summary_sql.CounterDateTime) b

ON a.objectname = b.objectname
25 июн 09, 17:33    [7344599]     Ответить | Цитировать Сообщить модератору
 Re: Помогите написать запрос с JOIN  [new]
Kirillich
Member

Откуда:
Сообщений: 581
Паганель
Автор, а зачем
Kirillich
substring
?

потому что изначально данное значение в chra(24)
а оно должно быть в datetime
25 июн 09, 17:35    [7344612]     Ответить | Цитировать Сообщить модератору
 Re: Помогите написать запрос с JOIN  [new]
Kirillich
Member

Откуда:
Сообщений: 581
Glory
И откуда начинается эта "вторая часть таблицы" ?

т.е. должна получиться таблица не с 4-мя полями а с 8-ю полями
25 июн 09, 17:36    [7344618]     Ответить | Цитировать Сообщить модератору
 Re: Помогите написать запрос с JOIN  [new]
Паганель
Member

Откуда: Винница
Сообщений: 22552
Kirillich
потому что изначально данное значение в chra(24)
в каком формате?
пример покажите, пожалуйста
25 июн 09, 17:38    [7344626]     Ответить | Цитировать Сообщить модератору
 Re: Помогите написать запрос с JOIN  [new]
Kirillich
Member

Откуда:
Сообщений: 581
Паганель
Kirillich
потому что изначально данное значение в chra(24)
в каком формате?
пример покажите, пожалуйста


2009-06-18 11:50:25.016

тип CHAR(24)

а что так смущает то в этом?
25 июн 09, 17:48    [7344684]     Ответить | Цитировать Сообщить модератору
 Re: Помогите написать запрос с JOIN  [new]
Паганель
Member

Откуда: Винница
Сообщений: 22552
0) неплохо было бы дату/время хранить как datetime а не как строку

1) В приведенном Вами примере не 24 символа, а 23

2) Может лучше вместо
Kirillich
and convert(datetime,substring (dbo.summary_sql.CounterDateTime,1,19),0)  between @date_at and @date_to
сделать
and dbo.summary_sql.CounterDateTime between convert(char(23), @date_at, 121) and convert(char(23), @date_to, 121)
?
25 июн 09, 17:57    [7344722]     Ответить | Цитировать Сообщить модератору
 Re: Помогите написать запрос с JOIN  [new]
Kirillich
Member

Откуда:
Сообщений: 581
Паганель
0) неплохо было бы дату/время хранить как datetime а не как строку

1) В приведенном Вами примере не 24 символа, а 23

2) Может лучше вместо
Kirillich
and convert(datetime,substring (dbo.summary_sql.CounterDateTime,1,19),0)  between @date_at and @date_to
сделать
and dbo.summary_sql.CounterDateTime between convert(char(23), @date_at, 121) and convert(char(23), @date_to, 121)
?




возможно и стоИт так сделать, но вопрос в данной теме не об этом, а как сделать таблицу с 8-ю полями
26 июн 09, 09:31    [7346104]     Ответить | Цитировать Сообщить модератору
 Re: Помогите написать запрос с JOIN  [new]
Паганель
Member

Откуда: Винница
Сообщений: 22552
Kirillich
как сделать таблицу с 8-ю полями
Вам уже подсказали, что для этого можно использовать full join

Мои же замечания, как нетрудно догадаться, касаются лишь моих опасений,
что Вы условием на substring не позволяете серверу использовать индекс по полю CounterDateTime
Хотя это лишь опасения, не более того
26 июн 09, 10:15    [7346323]     Ответить | Цитировать Сообщить модератору
 Re: Помогите написать запрос с JOIN  [new]
Kirillich
Member

Откуда:
Сообщений: 581
как-то так
SELECT a.*, b.* 
FROM

(select objectname, countername, dbo.summary_sql.CounterValue, convert(datetime,substring (dbo.summary_sql.CounterDateTime,1,19),0) 
from dbo.summary_sql with (NOLOCK), dbo.CounterDetails with (NOLOCK)
where dbo.summary_sql.counterid =dbo.CounterDetails.CounterID
and MachineName=@server
and objectname=@obj 
and countername=@cname
and convert(datetime,substring (dbo.summary_sql.CounterDateTime,1,19),0)  between @date_at1 and @date_to1
order by dbo.summary_sql.CounterDateTime) a

FULL OUTER JOIN

(select objectname, countername, dbo.summary_sql.CounterValue, convert(datetime,substring (dbo.summary_sql.CounterDateTime,1,19),0) 
from dbo.summary_sql with (NOLOCK), dbo.CounterDetails with (NOLOCK)
where dbo.summary_sql.counterid =dbo.CounterDetails.CounterID
and MachineName=@server
and objectname=@obj 
and countername=@cname
and convert(datetime,substring (dbo.summary_sql.CounterDateTime,1,19),0)  between @date_at and @date_to
order by dbo.summary_sql.CounterDateTime) b

ON a.objectname = b.objectname



при данном варианте получается не правильная выходная таблица

допустим каждый из select"ов возвращает 9000 записей по 4-ре поля
должно получиться 9000 записей по 8 полей
26 июн 09, 10:16    [7346334]     Ответить | Цитировать Сообщить модератору
 Re: Помогите написать запрос с JOIN  [new]
Glory
Member

Откуда:
Сообщений: 104760
Kirillich

возможно и стоИт так сделать, но вопрос в данной теме не об этом, а как сделать таблицу с 8-ю полями

А почему с 8ю полями, если меняется только @date_at @date_to ?
26 июн 09, 10:17    [7346341]     Ответить | Цитировать Сообщить модератору
 Re: Помогите написать запрос с JOIN  [new]
Паганель
Member

Откуда: Винница
Сообщений: 22552
Kirillich
при данном варианте получается не правильная выходная таблица
Вам не написали готовый вариант
Вам лишь подсказали, как можно соединять через full join результат двух запросов

Написать готовый вариант придется Вам самому, потому что кроме Вас никто не знает,
какая строка "второй части таблицы" должна быть "добавлена" напротив определенной строки "первой части таблицы"

Другими словами, только Вы знаете, что написать в последней строке приведенного запроса с full join,
то есть после слова ON
26 июн 09, 10:22    [7346365]     Ответить | Цитировать Сообщить модератору
 Re: Помогите написать запрос с JOIN  [new]
Kirillich
Member

Откуда:
Сообщений: 581
более простой пример, дальше я постараюсь сообразить

есть
select objectname, countername, dbo.summary_sql.CounterValue, dbo.summary_sql.CounterDateTime
from dbo.summary_sql with (NOLOCK), dbo.CounterDetails with (NOLOCK)
where dbo.summary_sql.counterid =dbo.CounterDetails.CounterID
and MachineName='\\mskicsrv1'

возвращает 9024 строки с четырьмя полями

надо составить запрос, чтобы было возвращено
9024 строки с 8-ю полями, и надоры дублировали друг друга, т.е. чтобы первые 4 поля соответствовали вторым 4-ем полям
26 июн 09, 10:37    [7346460]     Ответить | Цитировать Сообщить модератору
 Re: Помогите написать запрос с JOIN  [new]
Паганель
Member

Откуда: Винница
Сообщений: 22552
Kirillich
надо составить запрос, чтобы было возвращено
9024 строки с 8-ю полями, и надоры дублировали друг друга, т.е. чтобы первые 4 поля соответствовали вторым 4-ем полям
Ничего не понял, что за слово такое "соответствовали", что оно значит ?
Равны что ли?

тогда
select objectname, countername, dbo.summary_sql.CounterValue, dbo.summary_sql.CounterDateTime
,objectname, countername, dbo.summary_sql.CounterValue, dbo.summary_sql.CounterDateTime
from dbo.summary_sql with (NOLOCK), dbo.CounterDetails with (NOLOCK)
where dbo.summary_sql.counterid =dbo.CounterDetails.CounterID
and MachineName='\\mskicsrv1'
Но ведь Вы явно хотите не этого
А чего?
26 июн 09, 10:43    [7346505]     Ответить | Цитировать Сообщить модератору
 Re: Помогите написать запрос с JOIN  [new]
Glory
Member

Откуда:
Сообщений: 104760
Kirillich
более простой пример, дальше я постараюсь сообразить

есть
select objectname, countername, dbo.summary_sql.CounterValue, dbo.summary_sql.CounterDateTime
from dbo.summary_sql with (NOLOCK), dbo.CounterDetails with (NOLOCK)
where dbo.summary_sql.counterid =dbo.CounterDetails.CounterID
and MachineName='\\mskicsrv1'

возвращает 9024 строки с четырьмя полями

надо составить запрос, чтобы было возвращено
9024 строки с 8-ю полями, и надоры дублировали друг друга, т.е. чтобы первые 4 поля соответствовали вторым 4-ем полям

А если во втором периоде будет не 9024, а всего 1 строка, то тогда что ?
26 июн 09, 11:01    [7346619]     Ответить | Цитировать Сообщить модератору
 Re: Помогите написать запрос с JOIN  [new]
Kirillich
Member

Откуда:
Сообщений: 581
Glory
А если во втором периоде будет не 9024, а всего 1 строка, то тогда что ?


количество записей за единицу времени одинаковое.
т.е. одинаковое кол-во выводимый полей
26 июн 09, 11:06    [7346669]     Ответить | Цитировать Сообщить модератору
 Re: Помогите написать запрос с JOIN  [new]
Glory
Member

Откуда:
Сообщений: 104760
Kirillich
Glory
А если во втором периоде будет не 9024, а всего 1 строка, то тогда что ?


количество записей за единицу времени одинаковое.
т.е. одинаковое кол-во выводимый полей

Честное пионерское ?
Т.е. и за минуту и за час и за день будет одинаковое число записей ?

Сообщение было отредактировано: 26 июн 09, 11:11
26 июн 09, 11:10    [7346694]     Ответить | Цитировать Сообщить модератору
 Re: Помогите написать запрос с JOIN  [new]
belkinn
Member

Откуда: Msk
Сообщений: 11
должно быть он имеет ввиду, что за единицу времени(допустим, час) в таблицу вставляется фиксированное число строк(с информацией от какойто машины с периодичностью в минуту, например).
тогда перед запросом надо проверять, что количество временных единиц в периодах равно.
а если чтото пойдет не так и количество записей будут разными(что очень вероятно)?
26 июн 09, 11:45    [7346951]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить