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

Откуда:
Сообщений: 42
Здравствуйте!

Помогите, пожалуйста, разобраться со следующей задачей:
Есть два запроса, которые отличаются значением item:
select value0, data_date from data
where parnumber=18
and data_date > '2009-08-01 00:00:00' and data_date <= '2009-09-01 00:00:00'
and item = 33
and object = 4417
и
select value0, data_date from data
where parnumber=18
and data_date > '2009-08-01 00:00:00' and data_date <= '2009-09-01 00:00:00'
and item = 35
and object = 4417

При выполнении этих запросов в QA получаем две выборки со значениями по дням и часам за месяц.

Вопрос:
Как объединить эти два запроса в один, чтобы можно было сравнить соответствующие определённому чаcу значения по ИЛИ и затем подсчитать количество значений, где ИЛИ вернула TRUE???
10 сен 09, 08:06    [7639913]     Ответить | Цитировать Сообщить модератору
 Re: Как объединить два запроса в один  [new]
...Оо...
Guest
select value0, data_date from data
where parnumber=18
and data_date > '2009-08-01 00:00:00' and data_date <= '2009-09-01 00:00:00'
and (item = 33 or item = 35)
and object = 4417
10 сен 09, 08:15    [7639923]     Ответить | Цитировать Сообщить модератору
 Re: Как объединить два запроса в один  [new]
__Avenger__
Member

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

select value0, data_date from data
where parnumber=18
and data_date > '2009-08-01 00:00:00' and data_date <= '2009-09-01 00:00:00'
and item in (35, 31, 32)
and object = 4417
10 сен 09, 08:16    [7639924]     Ответить | Цитировать Сообщить модератору
 Re: Как объединить два запроса в один  [new]
DENIS_CHEL
Member

Откуда:
Сообщений: 23097
1) and item = 33 и and item = 35

заменить на and (item = 33 or item = 35)

2) почитайте про UNION

3) почитайте про BETWEEN

ЗЫ чесно не очень понял, что хочет автор, потому и такие сумбурные советы...
10 сен 09, 08:18    [7639928]     Ответить | Цитировать Сообщить модератору
 Re: Как объединить два запроса в один  [new]
ViTYAi
Member

Откуда:
Сообщений: 42
эээ... Я не точно сформулировал...
Я имею ввиду не выбор столбцов item по ИЛИ, а операцию ИЛИ над соответствующими ЗНАЧЕНИЯМИ столбцов item.
То есть условно говоря берём соответствующие значения из столбиков item=33 и item=35 и сравниваем их по ИЛИ, затем следующие значения из столбиков item=33 и item=35 и т. д. В итоге необходимо подсчитать - сколько раз ИЛИ вернула TRUE... То есть сколько раз в соответствующей паре значений сразу оба значения не равны нулю (как и работает логическое ИЛИ, собственно).
10 сен 09, 08:43    [7639966]     Ответить | Цитировать Сообщить модератору
 Re: Как объединить два запроса в один  [new]
DENIS_CHEL
Member

Откуда:
Сообщений: 23097
ViTYAi
эээ... Я не точно сформулировал...
Я имею ввиду не выбор столбцов item по ИЛИ, а операцию ИЛИ над соответствующими ЗНАЧЕНИЯМИ столбцов item.
То есть условно говоря берём соответствующие значения из столбиков item=33 и item=35 и сравниваем их по ИЛИ, затем следующие значения из столбиков item=33 и item=35 и т. д. В итоге необходимо подсчитать - сколько раз ИЛИ вернула TRUE... То есть сколько раз в соответствующей паре значений сразу оба значения не равны нулю (как и работает логическое ИЛИ, собственно).


Рекомендации по оформлению сообщений в форуме

4 и 6 пункты постарайтесь выполнять, это сильно ускорит получение ответа...
10 сен 09, 08:50    [7639978]     Ответить | Цитировать Сообщить модератору
 Re: Как объединить два запроса в один  [new]
ViTYAi
Member

Откуда:
Сообщений: 42
Вот скриншот двух выборок

К сообщению приложен файл. Размер - 0Kb
10 сен 09, 08:51    [7639982]     Ответить | Цитировать Сообщить модератору
 Re: Как объединить два запроса в один  [new]
ViTYAi
Member

Откуда:
Сообщений: 42
Версия SQL Server:

Microsoft SQL Server 2000 - 8.00.760 (Intel X86) Dec 17 2002 14:22:05 Copyright (c) 1988-2003 Microsoft Corporation Desktop Engine on Windows NT 5.1 (Build 2600: Service Pack 2)
10 сен 09, 08:53    [7639988]     Ответить | Цитировать Сообщить модератору
 Re: Как объединить два запроса в один  [new]
ambarka_max
Member

Откуда: Россия
Сообщений: 517
Может так?
SELECT * 
FROM (
  select value0, data_date from data
  where parnumber=18
    and data_date > '2009-08-01 00:00:00' and data_date <= '2009-09-01 00:00:00'
    and item = 33
    and object = 4417
) t1
FULL JOIN (
  select value0, data_date from data
  where parnumber=18
    and data_date > '2009-08-01 00:00:00' and data_date <= '2009-09-01 00:00:00'
    and item = 35
    and object = 4417
) t2 ON t1.data_date = t2.data_date
WHERE (t1.value0 > 0) OR (t2.value0 > 0)
Если резлитрующий набор тот что требуется, осталось вместо * поставить COUNT(*)
10 сен 09, 09:17    [7640048]     Ответить | Цитировать Сообщить модератору
 Re: Как объединить два запроса в один  [new]
ViTYAi
Member

Откуда:
Сообщений: 42
ambarka_max, похоже то, что надо! Благодарю весьма! :)

Потестирую для убедительности, но думаю всё будет правильно!
10 сен 09, 10:17    [7640337]     Ответить | Цитировать Сообщить модератору
 Re: Как объединить два запроса в один  [new]
Паганель
Member

Откуда: Винница
Сообщений: 22552
я может чего недоглядел...
скажите, пожалуйста, а откуда взялось условие,
чтобы value0 хотя бы одной из таблиц
не было ни NULL ни 0, ни меньше 0
?
10 сен 09, 10:22    [7640360]     Ответить | Цитировать Сообщить модератору
 Re: Как объединить два запроса в один  [new]
ViTYAi
Member

Откуда:
Сообщений: 42
Паганель
я может чего недоглядел...
скажите, пожалуйста, а откуда взялось условие,
чтобы value0 хотя бы одной из таблиц
не было ни NULL ни 0, ни меньше 0
?


Надо по условию задачи, чтобы пары значений из двух выборок были не равны нулю одновременно.
То есть по логическому ИЛИ их надо сравнить.
Меньше нуля не может быть, потому что это значения энергии.
10 сен 09, 11:22    [7640794]     Ответить | Цитировать Сообщить модератору
 Re: Как объединить два запроса в один  [new]
iljy
Member

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

SELECT * 
FROM (
  select data_date, max(case item when 33 then value0 end) value33,
          max(case item when 35 then value0 end) value35
  from data
  where parnumber=18
    and data_date > '2009-08-01 00:00:00' and data_date <= '2009-09-01 00:00:00'
    and item in (33,35)
    and object = 4417
  group by data_date
) t1
WHERE value33 > 0 OR value35 > 0
если таблица большая - так может быть быстрее. Плюс - если появяться еще варианты значений item - модифицировать проще.
10 сен 09, 11:28    [7640853]     Ответить | Цитировать Сообщить модератору
 Re: Как объединить два запроса в один  [new]
ViTYAi
Member

Откуда:
Сообщений: 42
iljy, спасибо за код!
количество записей порядка тысяч с большим запасом, то есть не десятки тысяч и не сотни!
10 сен 09, 12:04    [7641136]     Ответить | Цитировать Сообщить модератору
 Re: Как объединить два запроса в один  [new]
ViTYAi
Member

Откуда:
Сообщений: 42
iljy
ViTYAi,

SELECT * 
FROM (
  select data_date, max(case item when 33 then value0 end) value33,
          max(case item when 35 then value0 end) value35
  from data
  where parnumber=18
    and data_date > '2009-08-01 00:00:00' and data_date <= '2009-09-01 00:00:00'
    and item in (33,35)
    and object = 4417
  group by data_date
) t1
WHERE value33 > 0 OR value35 > 0
если таблица большая - так может быть быстрее. Плюс - если появяться еще варианты значений item - модифицировать проще.


Если добавятся еще item'ы, то как вы сказали "Модифицировать проще"...
SELECT count(*)
FROM (
  select data_date, max(case item when 47 then value0 end) value47,
                    max(case item when 49 then value0 end) value49,
	            max(case item when 55 then value0 end) value55,
                    max(case item when 57 then value0 end) value57
  from data
  where parnumber=18
    and data_date > '2009-09-01 00:00:00' and data_date <= '2009-09-16 00:00:00'
    and item in (47,49,55,57)
    and object = 4372
  group by data_date
) t1
WHERE value47 > 0 OR value49 > 0 OR value55 > 0 OR value57 > 0
А как, подскажите модифицировать запрос, если надо добавить ещё два item'а, но они относятся к другому object'у?
16 сен 09, 14:02    [7667320]     Ответить | Цитировать Сообщить модератору
 Re: Как объединить два запроса в один  [new]
iljy
Member

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

а конкретнее? собственно говоря просто добавить в список для item нужные значения и создать такую же проверку для object in (4372,...) подойдет? Можно еще добавить группировку по object если надо раздельно инфу получать.
16 сен 09, 14:23    [7667508]     Ответить | Цитировать Сообщить модератору
 Re: Как объединить два запроса в один  [new]
ViTYAi
Member

Откуда:
Сообщений: 42
iljy, Если конкретнее, то при написании object in (4372,4373) перебираться будут все item'ы для object=4372, а затем и для object=4373...
А надо, чтобы перебирались для object=4372 только item in (47,49,55,57), а для object=4373 только item in (31,33), а в итоге в условии WHERE должно быть сравнение по всем item'ам: value47 > 0 OR value49 > 0 OR value55 > 0 OR value57 > 0 OR value31 > 0 OR value33 > 0
17 сен 09, 06:34    [7670835]     Ответить | Цитировать Сообщить модератору
 Re: Как объединить два запроса в один  [new]
iljy
Member

Откуда:
Сообщений: 8711
ViTYAi

А надо, чтобы перебирались для object=4372 только item in (47,49,55,57), а для object=4373 только item in (31,33)


object = 4372 and item in (47,49,55,57) or
object = 4373 and item in (31,33)

так?
Есть один момент - такое условие может плохо оптимизатором обработаться. Тогда возможно будет лучше таки объединить object in (4372, 4373) and item in (31,33,47,49,55,57) и проверять пару object = ... and item = ... непосредственно в case внутри max
17 сен 09, 09:52    [7671147]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить