Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Непонятная работа UNION
Форум на CrossPlatform.RU > Разработка > SQL. Базы данных.
NetWorm
SELECT
   materials.name AS material,
   SUM(o_sklad.count) AS count,
   ed_izm.name AS ed_izm,
   0 AS count2
FROM
   o_sklad,
   materials,
   ed_izm
WHERE
   o_sklad.id_material = materials.id
   AND materials.id_ed_izm = ed_izm.id
   AND o_sklad.date <'01.11.2011'
GROUP BY
   materials.name,
   ed_izm.name

   UNION ALL

SELECT
   materials.name AS material,
   SUM(0) AS count,
   ed_izm.name AS ed_izm,
   SUM(o_sklad.count) AS count2
FROM
   o_sklad,
   materials,
   ed_izm
WHERE
   o_sklad.id_material = materials.id
   AND materials.id_ed_izm = ed_izm.id
   AND o_sklad.date <'30.11.2011'
GROUP BY
   materials.name,
   ed_izm.name


И в результате возвращаются двойные строки. т.е. он не объединяет SUM(0) AS count2 из первого запроса и SUM(o_sklad.count) AS count2. Короче мне нужно получить одну таблицу с результатами двух запросов
ilyabvt
А мне непонятна логика запроса.
Цитата
o_sklad.date <'01.11.2011'

Цитата
o_sklad.date <'30.11.2011'

Мне кажется тут будет наблюдаться пересечение.
Цитата
SUM(0)

Зачем суммировать 0?
Цитата
SUM(0) AS count2 из первого запроса

В первом запросе у вас "0 AS count2 ". Но это уже мелочь

Цитата
И в результате возвращаются двойные строки

"UNION ALL" и пересечение дат дали вполне предсказуемый результат.

P.S. Я не спец. по SQL, могу и ошибаться...
Iron Bug
Цитата(NetWorm @ 12.11.2011, 23:53) *
Короче мне нужно получить одну таблицу с результатами двух запросов

UNION просто склеивает результаты в одну таблицу.

для объединения используется JOIN и запрос конструируется более хитро.

но в данном случае вообще непонятен сам смысл задачи: зачем-то часть записей два раза вытаскивается (сначала с нулями, потом - с какими-то суммами), а другая часть - один раз. так что я даже затрудняюсь сказать, как это лучше решить, потому что просто не вижу смысла в суммировании нулей.
NetWorm
Цитата(Iron Bug @ 13.11.2011, 2:57) *
Цитата(NetWorm @ 12.11.2011, 23:53) *
Короче мне нужно получить одну таблицу с результатами двух запросов

UNION просто склеивает результаты в одну таблицу.

для объединения используется JOIN и запрос конструируется более хитро.

но в данном случае вообще непонятен сам смысл задачи: зачем-то часть записей два раза вытаскивается (сначала с нулями, потом - с какими-то суммами), а другая часть - один раз. так что я даже затрудняюсь сказать, как это лучше решить, потому что просто не вижу смысла в суммировании нулей.


Мне из 3 колонок одних и тех же надо получить 4... В первом запросе мне надо получить остатки на начало месяца, во втором на конец месяца, одним запросом
ilyabvt
Цитата
Мне из 3 колонок одних и тех же надо получить 4

Через UNION вы такого не сделаете. А вводить нулевую колонку - извращение.
Цитата
В первом запросе мне надо получить остатки на начало месяца, во втором на конец месяца

Ну тогда вам надо указывать диапазон, а не просто "<'30.11.2011'" в противном случае вы получаете не только за конец месяца, но вообще за весь месяц и за все предыдущие месяцы.

Покажите структуру этих трех таблиц и как они связаны.
NetWorm
Цитата(ilyabvt @ 13.11.2011, 11:53) *
Цитата
Мне из 3 колонок одних и тех же надо получить 4

Через UNION вы такого не сделаете. А вводить нулевую колонку - извращение.
Цитата
В первом запросе мне надо получить остатки на начало месяца, во втором на конец месяца

Ну тогда вам надо указывать диапазон, а не просто "<'30.11.2011'" в противном случае вы получаете не только за конец месяца, но вообще за весь месяц и за все предыдущие месяцы.

Покажите структуру этих трех таблиц и как они связаны.


Я разобрался все!

SELECT 
   query.material,
   query.ed_izm,
   SUM(query.count) AS count1,
   SUM(query.count2) AS count2,
   SUM(query.count3) AS count3,
   SUM(query.count4) AS count4
  

FROM (SELECT
    materials.name AS material,
    SUM(o_sklad.count) AS count,
    ed_izm.name AS ed_izm,
    0 AS count2,
    0 AS count3,
    0 AS count4    
   FROM
    public.o_sklad,
    public.materials,
    public.ed_izm
   WHERE
    o_sklad.id_material = materials.id
    AND materials.id_ed_izm = ed_izm.id
    AND o_sklad.date <='01.11.2011'
   GROUP BY
    materials.name,
    ed_izm.name

   UNION ALL

   SELECT
    materials.name AS material,
    0 AS count,
    ed_izm.name AS ed_izm,
    SUM(o_sklad.count) AS count2,
    0 AS count3,
    0 AS count4
   FROM
    public.o_sklad,
    public.materials,
    public.ed_izm
   WHERE
    o_sklad.id_material = materials.id
    AND materials.id_ed_izm = ed_izm.id
    AND o_sklad.date BETWEEN '01.11.2011' AND '21.11.2011'
    AND o_sklad.type_operacii = 1
   GROUP BY
    materials.name,
    ed_izm.name

   UNION ALL

   SELECT
    materials.name AS material,
    0 AS count,
    ed_izm.name AS ed_izm,
    0 AS count2,
    SUM(o_sklad.count * -1) AS count3,
    0 AS count4
   FROM
    public.o_sklad,
    public.materials,
    public.ed_izm
   WHERE
    o_sklad.id_material = materials.id
    AND materials.id_ed_izm = ed_izm.id
    AND o_sklad.date BETWEEN '01.11.2011' AND '21.11.2011'
    AND o_sklad.type_operacii = 2
   GROUP BY
    materials.name,
    ed_izm.name

   UNION ALL

   SELECT
    materials.name AS material,
    0 AS count,
    ed_izm.name AS ed_izm,
    0 AS count2,
    0 AS count3,
    SUM(o_sklad.count) AS count4    
   FROM
    public.o_sklad,
    public.materials,
    public.ed_izm
   WHERE
    o_sklad.id_material = materials.id
    AND materials.id_ed_izm = ed_izm.id
    AND o_sklad.date BETWEEN '01.11.2011' AND '31.11.2011'
   GROUP BY
    materials.name,
    ed_izm.name

    ) AS query

GROUP BY
   query.material,
      query.ed_izm
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Форум IP.Board © 2001-2024 IPS, Inc.