Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Web программирование > SQL, базы данных
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 10.05.2012, 14:45   #1
SovereignSun
Форумчанин
 
Регистрация: 22.11.2011
Сообщений: 127
По умолчанию Представления запроса where в виде отдельной колонки

Встал очередной интересный вопрос, вот у меня есть запрос:

Код:
SELECT 
  org.id_name,
  org.id_region,
  org.id_inn,
  org.id_kpp,
  org.id_username,
  money.id_date_money,
  money.id_done
FROM
  org
  LEFT OUTER JOIN money ON (org.id_org = money.id_org)
WHERE
  money.id_date_money IS NULL OR 
  money.id_date_money = '2012-03-01'
ORDER BY
  org.id_name
но это только по Марту месяцу, теперь мне нужно чтобы был внутри этого запроса еще запрос с колокной уже на Апрель, и т.д.

тоесть сделать что-то типа:
Код:
SELECT 
  org.id_name,
  org.id_region,
  org.id_inn,
  org.id_kpp,
  org.id_username,
  money.id_date_money,
  money.id_done
FROM
  org
  LEFT OUTER JOIN money ON (org.id_org = money.id_org)
WHERE
  money.id_date_money IS NULL OR 
  money.id_date_money = '2012-03-01'
UNION
SELECT 
  org.id_name,
  org.id_region,
  org.id_inn,
  org.id_kpp,
  org.id_username,
  money.id_date_money,
  money.id_done
FROM
  org
  LEFT OUTER JOIN money ON (org.id_org = money.id_org)
WHERE
  money.id_date_money IS NULL OR 
  money.id_date_money = '2012-04-01'
только так, чтобы только поле money.id_done за этот месяц было как столбец в первом запросе, все остальные поля не нужны.

Колчествео получается организаций всегда будет равным в любом запросе, менятся будет только boolean поле id_done по запросу id_date_money. Там где в таблице нету записи, стоит null.

тоесть:
id_name id_inn id_kpp id_username id_done1 id_done2
dfh 234236 23623 sdkjhgs 1 1
dfhdfh 232362 23672 sdgdfhjsds 1 0
sgdasd 236723 23352 seg fhdfhjwe 0 1
sgsw 236472 23657 uioqhijsbf 1 1
weyw 236721 97162 iygbqkjfshbf 0 1
atwgas 237969 26598 piugqksjbf 0 0
weta 879651 26861 opihqbwtku 0 0
SovereignSun вне форума Ответить с цитированием
Старый 10.05.2012, 14:56   #2
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

погодите-ка...
union вернёт вам ещё одну запись (строчку) в запросе.
А Вы в теме написали, что Вам нужно каждый месяц в отдельном столбце (а не строке)?

Что нужно то?

а вообще, стандартный SQL не любит то, что не укладывается в реляционную модель. поэтому соорудить запрос с ПРОИЗВОЛЬНЫМ числом столбцов достаточно сложно (нужно ХП подключать, или генерить запрос на лету и т.п. извращения)

а вот если каждый месяц в отдельной строчке - так это за милую душу
пишете запрос
в условиях добавляете where ... and money.id_date_money between НачалоПериода and КонецПериода
и запрос группируете по месяцу
group by month(money.id_date_money)

p.s. функция получения месяца из даты отличается в разных СУБД

p.p.s. сорри, если я вдруг неправильно понял, что вам нужно...
Serge_Bliznykov вне форума Ответить с цитированием
Старый 10.05.2012, 15:05   #3
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,543
По умолчанию

Код:
SELECT 
  org.id_name,
  org.id_region,
  org.id_inn,
  org.id_kpp,
  org.id_username,
  mart.id_date_money,
  mart.id_done,
  april.id_date_money,
  april.id_done
............
FROM
  org
  LEFT OUTER JOIN money as mart ON (org.id_org = mart.id_org) and  ( mart.id_date_money IS NULL OR  mart.id_date_money = '2012-03-01' )
  LEFT OUTER JOIN money as april ON (org.id_org = april.id_org) and  ( april.id_date_money IS NULL OR  april.id_date_money = '2012-04-01' )
.............................
WHERE mart.id_org is not null 
  or april.id_org is not null
...........................
и долго-долго гадаем (или все-таки размышляем) почему это одно и тоже попадает в разные месяца!!!
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось evg_m; 10.05.2012 в 15:12.
evg_m вне форума Ответить с цитированием
Старый 10.05.2012, 15:54   #4
SovereignSun
Форумчанин
 
Регистрация: 22.11.2011
Сообщений: 127
По умолчанию

Для тех кому я похо обьяснил...
нужно запросы:

Код:
WHERE
  money.id_date_money IS NULL OR 
  money.id_date_money = '2012-03-01'
превратить в колонку Март 2012 и
Код:
WHERE
  money.id_date_money IS NULL OR 
  money.id_date_money = '2012-04-01'
превратить в колонку Апрель 2012 и т.п.

Последний раз редактировалось SovereignSun; 10.05.2012 в 16:14.
SovereignSun вне форума Ответить с цитированием
Старый 10.05.2012, 16:03   #5
SovereignSun
Форумчанин
 
Регистрация: 22.11.2011
Сообщений: 127
По умолчанию

Цитата:
Сообщение от evg_m Посмотреть сообщение
Код:
SELECT 
  org.id_name,
  org.id_region,
  org.id_inn,
  org.id_kpp,
  org.id_username,
  mart.id_date_money,
  mart.id_done,
  april.id_date_money,
  april.id_done
............
FROM
  org
  LEFT OUTER JOIN money as mart ON (org.id_org = mart.id_org) and  ( mart.id_date_money IS NULL OR  mart.id_date_money = '2012-03-01' )
  LEFT OUTER JOIN money as april ON (org.id_org = april.id_org) and  ( april.id_date_money IS NULL OR  april.id_date_money = '2012-04-01' )
.............................
WHERE mart.id_org is not null 
  or april.id_org is not null
...........................
и долго-долго гадаем (или все-таки размышляем) почему это одно и тоже попадает в разные месяца!!!
Есть нюанс, а так супер вроде.. только он почему-то некоторые записи повторяет и жалуется: Invalid token "is" at position 89 of line 13 почему-то, но работает.

как сделать, чтобы записи не повторялись?




--- SELECT Distinct -- почему-то справился с этой ситуацией

Последний раз редактировалось SovereignSun; 10.05.2012 в 16:06.
SovereignSun вне форума Ответить с цитированием
Старый 10.05.2012, 21:11   #6
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,543
По умолчанию

смотреть выделенное красным и думать
Цитата:
и долго-долго гадаем (или все-таки размышляем) почему это одно и тоже попадает в разные месяца!!!
Цитата:
Invalid token "is" at position 89 of line 13
Телепатор отказывается говорить что написано там "at position 89 of line 13"
Возможно где-то нужно расставить скобки.

Цитата:
только он почему-то некоторые записи повторяет
Значит есть повторы данных в money.
Код:
 mart.id_date_money IS NULL //вот тебе первая строчка 
OR  
mart.id_date_money = '2012-03-01'  // а вот и вторая !!!!
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось evg_m; 11.05.2012 в 09:33.
evg_m вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Для числа X проверить возможность представления данного числа в виде заданной степенной функции. migraine Помощь студентам 0 06.12.2011 22:01
Не работает видеорежим на отдельной машине dkann Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 3 26.05.2011 18:07
C++/ Все способы представления заданного натурального числа N в виде суммы двух кубов натуральных чисел / acko Помощь студентам 1 25.09.2010 12:15
Сохранение базы MySQL в виде запроса... masterdela БД в Delphi 3 25.02.2009 07:01
Выбор значений по отдельной группе michi SQL, базы данных 2 15.10.2008 22:35