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

Откуда:
Сообщений: 8
Добрый день!
Есть два запроса, котрые выводят данные о суммах удержаний и доплат для конкретного человека, в заданный период.
SELECT Pers_Card_TABLE.tab_num, SUM(Adn_guide_table.adn_perc)
FROM Addition_TABLE ,Pers_Card_TABLE, ADn_guide_table
WHERE (Pers_Card_TABLE.tab_num = Addition_TABLE.tb_num)
  AND (Addition_TABLE.o_Date > '1.1.11')
  AND (Addition_TABLE.o_Date < '1.2.11')
  AND (Pers_Card_TABLE.tab_num = 1)
  AND (Adn_guide_TABLE.code = Addition_TABLE.o_code)
GROUP BY Pers_Card_TABLE.tab_num

SELECT Pers_Card_TABLE.tab_num, SUM(Ded_guide_table.Ded_perc)
FROM Deduction_TABLE ,Pers_Card_TABLE, Ded_guide_table
WHERE (Pers_Card_TABLE.tab_num = Deduction_TABLE.tb_num)
  AND (Deduction_TABLE.o_Date > '1.1.11')
  AND (Deduction_TABLE.o_Date < '1.2.11')
  AND (Pers_Card_TABLE.tab_num = 1)
  AND (Ded_guide_TABLE.code = Deduction_TABLE.o_code)
GROUP BY Pers_Card_TABLE.tab_num

Результаты выполнения запросов:
TB_NUM SUM(Adn_guide_table.adn_perc)
1 23

TB_NUM SUM(Ded_guide_table.Ded_perc)
1 15


Помогите составить запрос, результатом которого была бы следующая таблица:
TB_NUM SUM(Adn_guide_table.adn_perc) SUM(Ded_guide_table.Ded_perc)
1 23 15

Я делала следующим образом:
SELECT Pers_Card_TABLE.tab_num, SUM(Adn_guide_table.adn_perc), SUM(DED_guide_table.DED_perc
FROM Pers_Card_TABLE, Addition_TABLE, Adn_guide_table, Deduction_TABLE, ded_guide_table
WHERE (Pers_Card_TABLE.tab_num = Addition_TABLE.tb_num)
  AND (Addition_TABLE.o_Date > '1.1.11')
  AND (Addition_TABLE.o_Date < '1.2.11')
  AND (Adn_guide_TABLE.code = Addition_TABLE.o_code)
  AND (Pers_Card_TABLE.tab_num = Deduction_TABLE.tb_num)
  AND (Deduction_TABLE.o_Date > '1.1.11')
  AND (Deduction_TABLE.o_Date < '1.2.11')
  AND (ded_guide_TABLE.code = Deduction_TABLE.o_code)
  AND (Pers_Card_TABLE.tab_num = 1)
GROUP BY Pers_Card_TABLE.tab_num

Этот запрос выдает неверный результат, а именно:
TB_NUM SUM(Adn_guide_table.adn_perc) SUM(Ded_guide_table.Ded_perc)
1 69 30

Что не так в последнем запросе?
23 май 12, 18:58    [12603920]     Ответить | Цитировать Сообщить модератору
 Re: Запрос из двух простых с интервалом по дате  [new]
Добрый Э - Эх
Guest
TuarTuar
...
  AND (Addition_TABLE.o_Date > '1.1.11')
  AND (Addition_TABLE.o_Date < '1.2.11')
...
NLS-зависимая мина замедленного действия.


TuarTuar
Что не так в последнем запросе?
предполагаемый тобой алгоритм выполнения запроса не совпадает с фактическим .

самое простое - склеить эти два запроса через встроенные представления:

select *
 from (тут весь твой запрос 1) v1,
      (тут весь твой запрос 2) v2
 where v1.tab_num = v2.tab_num
23 май 12, 19:28    [12604033]     Ответить | Цитировать Сообщить модератору
 Re: Запрос из двух простых с интервалом по дате  [new]
SY
Member

Откуда: Middlebury, CT USA
Сообщений: 10045
TuarTuar,

WITH t1 as (
            SELECT  Pers_Card_TABLE.tab_num,
                    SUM(Adn_guide_table.adn_perc) sum_add
              FROM  Addition_TABLE,
                    Pers_Card_TABLE,
                    ADn_guide_table
              WHERE Pers_Card_TABLE.tab_num = Addition_TABLE.tb_num
                AND Addition_TABLE.o_Date > '1.1.11'
                AND Addition_TABLE.o_Date < '1.2.11'
                AND Pers_Card_TABLE.tab_num = 1
                AND Adn_guide_TABLE.code = Addition_TABLE.o_code
              GROUP BY Pers_Card_TABLE.tab_num
           ),
     t2 as (
            SELECT  Pers_Card_TABLE.tab_num,
                    SUM(Ded_guide_table.Ded_perc) sum_deduct
              FROM  Deduction_TABLE,
                    Pers_Card_TABLE,
                    Ded_guide_table
              WHERE Pers_Card_TABLE.tab_num = Deduction_TABLE.tb_num
                AND Deduction_TABLE.o_Date > '1.1.11'
                AND Deduction_TABLE.o_Date < '1.2.11'
                AND Pers_Card_TABLE.tab_num = 1
                AND Ded_guide_TABLE.code = Deduction_TABLE.o_code
              GROUP BY Pers_Card_TABLE.tab_num
           )
SELECT  nvl(t1.tab_num,t2.tab_num) tab_num
        sum_add,
        sum_deduct
  from      t1
        full outer join
            t2
          on t1.tab_num = t2.tab_num
/


SY.
23 май 12, 19:34    [12604051]     Ответить | Цитировать Сообщить модератору
 Re: Запрос из двух простых с интервалом по дате  [new]
stax..
Guest
TuarTuar,

+
union all - pivot
union all -goroup by-sum -decode

.....
stax
23 май 12, 20:37    [12604354]     Ответить | Цитировать Сообщить модератору
 Re: Запрос из двух простых с интервалом по дате  [new]
TuarTuar
Member

Откуда:
Сообщений: 8
Отлично! Все работает, в результате получилась смесь из первых двух вариантов.
Спасибо, товарищи!
27 май 12, 22:18    [12622899]     Ответить | Цитировать Сообщить модератору
 Re: Запрос из двух простых с интервалом по дате  [new]
ORA__SQL
Member

Откуда: Moscow
Сообщений: 1774
TuarTuar,
AND (Addition_TABLE.o_Date < '1.2.11')
Всегда было интересно, это 1 февраля или 2 января
27 май 12, 22:22    [12622914]     Ответить | Цитировать Сообщить модератору
 Re: Запрос из двух простых с интервалом по дате  [new]
andreymx
Member

Откуда: Запорожье
Сообщений: 54382
удержания и доплаты хранить в одной таблице
28 май 12, 00:22    [12623288]     Ответить | Цитировать Сообщить модератору
 Re: Запрос из двух простых с интервалом по дате  [new]
TuarTuar
Member

Откуда:
Сообщений: 8
ORA__SQL
TuarTuar,
AND (Addition_TABLE.o_Date < '1.2.11')
Всегда было интересно, это 1 февраля или 2 января

Это первое февраля)
28 май 12, 15:42    [12626582]     Ответить | Цитировать Сообщить модератору
 Re: Запрос из двух простых с интервалом по дате  [new]
Vint
Member

Откуда: Москва
Сообщений: 4564
TuarTuar,
тебе так только кажеться...)
28 май 12, 15:44    [12626605]     Ответить | Цитировать Сообщить модератору
 Re: Запрос из двух простых с интервалом по дате  [new]
-2-
Member

Откуда:
Сообщений: 15330
TuarTuar
ORA__SQL
AND (Addition_TABLE.o_Date < '1.2.11')
Всегда было интересно, это 1 февраля или 2 января
Это первое февраля)
или первое этого месяца
select to_char(cast('1.2.11' as date), 'syyyy-mm-dd') from dual;

TO_CHAR(CAST('1.2.11'ASDATE),'SYYYY-MM-DD')
-------------------------------------------
2012-05-01                                  
или ....
28 май 12, 15:53    [12626686]     Ответить | Цитировать Сообщить модератору
 Re: Запрос из двух простых с интервалом по дате  [new]
agathis
Member

Откуда:
Сообщений: 94
-2-
или первое этого месяца
select to_char(cast('1.2.11' as date), 'syyyy-mm-dd') from dual;

TO_CHAR(CAST('1.2.11'ASDATE),'SYYYY-MM-DD')
-------------------------------------------
2012-05-01                                  
или ....


это как? что в NLS_DATE_FORMAT? :)
29 май 12, 12:03    [12630674]     Ответить | Цитировать Сообщить модератору
 Re: Запрос из двух простых с интервалом по дате  [new]
Добрый Э - Эх
Guest
agathis
это как?


про американцев когда-нибудь слышал?
так вот, у этих самых американцев в строковом представлении даты по умолчанию вначале идет номер месяца, после - номер дня в месяце и лишь затем год...
29 май 12, 12:50    [12631090]     Ответить | Цитировать Сообщить модератору
 Re: Запрос из двух простых с интервалом по дате  [new]
Добрый Э - Эх
Guest
не дописал...
а кроме американцев - ещё есть куча "странных" народов, с "настройками" календаря, отличными от славянских...
29 май 12, 12:52    [12631103]     Ответить | Цитировать Сообщить модератору
 Re: Запрос из двух простых с интервалом по дате  [new]
agathis
Member

Откуда:
Сообщений: 94
Добрый Э - Эх
не дописал...
а кроме американцев - ещё есть куча "странных" народов, с "настройками" календаря, отличными от славянских...


это все есть, но как из такой строки получается 1 мая, все равно не очень понимаю.
29 май 12, 13:07    [12631269]     Ответить | Цитировать Сообщить модератору
 Re: Запрос из двух простых с интервалом по дате  [new]
bdsm_sql
Member

Откуда:
Сообщений: 948
agathis
Добрый Э - Эх
не дописал...
а кроме американцев - ещё есть куча "странных" народов, с "настройками" календаря, отличными от славянских...


это все есть, но как из такой строки получается 1 мая, все равно не очень понимаю.

select to_date('1.2.11', '"1.2.11"') from dual
29 май 12, 13:12    [12631320]     Ответить | Цитировать Сообщить модератору
 Re: Запрос из двух простых с интервалом по дате  [new]
stax..
Guest
Добрый Э - Эх
не дописал...
а кроме американцев - ещё есть куча "странных" народов, с "настройками" календаря, отличными от славянских...

в славянских тож

SQL> alter session set nls_date_format='hh24.mi.ss';

Session altered.

SQL> SELECT TO_CHAR(CAST('1.2.11' AS DATE),'SYYYY-MM-DD')
  2  from dual
  3  /

TO_CHAR(CAS
-----------
 2012-05-01


.....
stax
29 май 12, 13:18    [12631380]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить