powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / выборка данных из 2 связанных таблиц с несколькими sum функциями
44 сообщений из 44, показаны все 2 страниц
выборка данных из 2 связанных таблиц с несколькими sum функциями
    #38739911
Davidkoko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Здравствуйте!
`В базе имеется таблицы:incomes,sales,Products. Задача следуюшая- в query вывести:
1. sum(incomes)
2. sum(sales)
3. количество товаров сейчас: a-b

таблица 'incomes' имеет столбцы:Incomeid,ProductId,quant(количество прыходов)...
таблица 'sales' имеет столбцы: SalesId, IncomeId, ProductId, quant(количество продаж товара) ...

пишу SQL:

select i.productId, sum(i.quant) as iq, sum(s.quant) as sq
from income i,sales s*
where (i.incomeId=s.incomeId)
group by i.productId

или

select i.productId, sum(i.quant) as iq, sum(s.quant) as sq
from income
left outer join s on (i.IncomeId=s.IncomeId)
group by i.productId

но вместо того чтобы вывести:

Код: plaintext
1.
2.
3.
4.
5.
 productIdId   sum(income)   sum(sales)    now

       1          200           50         150    
       2          150           20         130    
       3          120           100        20      
выводит неправильную сумму количеств прыходов-sum(income):
Код: plaintext
1.
2.
3.
4.
5.
 productIdId    sum(income)   sum(sales)    now       

       1          20000        50         19950     
       2          27500        20         27480   
       3          125000      100         12400   
database server- Interbase 2009.

спасибо заранее!
...
Рейтинг: 0 / 0
выборка данных из 2 связанных таблиц с несколькими sum функциями
    #38739914
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Davidkokodatabase server- Interbase 2009.
В котором нет ни derived tables, ни CTE. Если уберёшь третий пункт и разницу будешь
считать непосредственно при выводе - можешь обойтись подзапросами. Иначе - хранимая
процедура или монстровитый union all с последующим group by.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
выборка данных из 2 связанных таблиц с несколькими sum функциями
    #38739922
Davidkoko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovDavidkokodatabase server- Interbase 2009.
В котором нет ни derived tables, ни CTE. Если уберёшь третий пункт и разницу будешь
считать непосредственно при выводе - можешь обойтись подзапросами. Иначе - хранимая
процедура или монстровитый union all с последующим group by.


без третьего пункта тоже не смог решить.
А если перевести базу в Firebird 2.5? поможет (derived tables и CTE)?
...
Рейтинг: 0 / 0
выборка данных из 2 связанных таблиц с несколькими sum функциями
    #38739926
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DavidkokoА если перевести базу в Firebird 2.5?
Тогда у тебя они будут в распоряжении и запрос станет простым и элегантным.

Но если ты с такой лёгкостью можешь манипулировать базой, то проще будет объединить эти
две таблицы в одну. Тогда запрос вообще станет тривиальным.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
выборка данных из 2 связанных таблиц с несколькими sum функциями
    #38739978
Davidkoko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovDavidkokoА если перевести базу в Firebird 2.5?
Тогда у тебя они будут в распоряжении и запрос станет простым и элегантным.

Но если ты с такой лёгкостью можешь манипулировать базой, то проще будет объединить эти
две таблицы в одну. Тогда запрос вообще станет тривиальным.


Dimitry Sibiryakov, огромнейшее спасибо! проверил в Firebird 2.5 и все правильно работает, и разницу sum(income)-sum(sales) считивает.

если можно еще одинь вопрос:что вы имели ввиду когда писали: "проще будет объединить эти две таблицы в одну"? я всегда думал что в целях нормализации БД sales и incomes обьязательно должни быть в отдельных таблицах!
...
Рейтинг: 0 / 0
выборка данных из 2 связанных таблиц с несколькими sum функциями
    #38739987
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Davidkokoчто вы имели ввиду когда писали: "проще будет объединить эти две таблицы в
одну"? я всегда думал что в целях нормализации БД sales и incomes обьязательно должни быть
в отдельных таблицах!
И какую же нормальную форму ты пытаешься воплотить в жизнь разделяя одну сущность
"движение средств" на две таблицы?..
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
выборка данных из 2 связанных таблиц с несколькими sum функциями
    #38739999
Davidkoko
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovDavidkokoчто вы имели ввиду когда писали: "проще будет объединить эти две таблицы в
одну"? я всегда думал что в целях нормализации БД sales и incomes обьязательно должни быть
в отдельных таблицах!
И какую же нормальную форму ты пытаешься воплотить в жизнь разделяя одну сущность
"движение средств" на две таблицы?..


еще раз спасибо, я много раз думал об этом, но никак не мог рисковать. Вы мне очен помогли!
...
Рейтинг: 0 / 0
выборка данных из 2 связанных таблиц с несколькими sum функциями
    #38768840
Фотография des1roer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
народ подскажите как сумму выбрать? фб 1.5
Код: sql
1.
2.
3.
4.
select SUM(BRUTTO)
from PROTOKOL
where (D +  T >  '07.10.2014 8:00:00' and D +  T <  '07.10.2014 20:00:00' )
order by PROTOKOL.D + PROTOKOL.T desc;


Can't format message 13:896 -- message system code -4.
Dynamic SQL Error.
SQL error code = -104.
Invalid expression in the ORDER BY clause (not contained in either an aggregate function or the GROUP BY clause).
(3,058 с)
...
Рейтинг: 0 / 0
выборка данных из 2 связанных таблиц с несколькими sum функциями
    #38768855
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
des1roer,

накой тебе ORDER BY при подсчёте одной единственной суммы?
...
Рейтинг: 0 / 0
выборка данных из 2 связанных таблиц с несколькими sum функциями
    #38768856
Фотография des1roer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
order был лишним
Код: sql
1.
2.
3.
select SUM(BRUTTO)
from PROTOKOL
where (D +  T >  '07.10.2014 8:00:00' and D +  T <  '07.10.2014 20:00:00' )
...
Рейтинг: 0 / 0
выборка данных из 2 связанных таблиц с несколькими sum функциями
    #38768859
Фотография des1roer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов Денис, спс. Сам увидел. просто из более сложного запроса осталось))))
...
Рейтинг: 0 / 0
выборка данных из 2 связанных таблиц с несколькими sum функциями
    #38768960
Фотография des1roer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
млин объясните нубу.
вот этот запрос намертво ложит емс
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
   SELECT
            FIRST 1 D + T            
            FROM PROTOKOL
             left outer join CARGO CARGO1 on (PROTOKOL.FK_CARGO = CARGO1.ID_CARGO)
            where 
             (    D +  T >  
           (
            SELECT
            FIRST 1 D + T  
            FROM PROTOKOL
            left outer join CARGO CARGO1 on (PROTOKOL.FK_CARGO = CARGO1.ID_CARGO)
            where 
          (D +  T >  '07.10.2014 8:00:00' and D +  T <  '07.10.2014 20:00:00' ) 
           and NAME_CARGO = 'Магнетитовая'
            order by D + T desc
             ) 
            and  D +  T <  '07.10.2014 23:00:00'  )       
            and NAME_CARGO = 'Магнет. порожняк'


вложенный запрос отрабатывает хоть и медленно (3 с), но корректно
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
  SELECT
            FIRST 1 D + T  
            FROM PROTOKOL
            left outer join CARGO CARGO1 on (PROTOKOL.FK_CARGO = CARGO1.ID_CARGO)
            where 
          (D +  T >  '07.10.2014 8:00:00' and D +  T <  '07.10.2014 20:00:00' ) 
           and NAME_CARGO = 'Магнетитовая'
            order by D + T desc
...
Рейтинг: 0 / 0
выборка данных из 2 связанных таблиц с несколькими sum функциями
    #38768980
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
des1roerобъясните нубу.
Исчерпывающее описание
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
выборка данных из 2 связанных таблиц с несколькими sum функциями
    #38768984
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
des1roer,

по мелочи
D + T
сделай уже вычисляемый столбец DT как D+T, чтобы не писать постоянно D+T

FROM PROTOKOL left outer join CARGO CARGO1
либо не пиши алиасы совсем, либо пиши везде.
from protocol p left join cargo c
тут точно нужен left join?

des1roerвложенный запрос отрабатывает хоть и медленно (3 с), но корректно
вложенный запрос сначала выполняется целиком, потому что
order by D + T desc
приводит к PLAN SORT, т.е. сначала запрос выполнится, и отсортируется результат, а потом только будет выбрана его первая запись (first).

И "намертво ложит емс" - емс тут ни при чем, он просто ждет ответа от сервера, а запрос выполняется очень долго.
...
Рейтинг: 0 / 0
выборка данных из 2 связанных таблиц с несколькими sum функциями
    #38768985
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
des1roer,

сам виноват. Этот запрос

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
  SELECT
            FIRST 1 D + T  
            FROM PROTOKOL
            left outer join CARGO CARGO1 on (PROTOKOL.FK_CARGO = CARGO1.ID_CARGO)
            where 
          (D +  T >  '07.10.2014 8:00:00' and D +  T <  '07.10.2014 20:00:00' ) 
           and NAME_CARGO = 'Магнетитовая'
            order by D + T desc


наверняка не использует индекс. Попробуй создать вычисляемый индекс по D + T.

По поводу запроса в целом. Такие подзапросы не материализуются, а следовательно будут перевыполняться на каждой итерации. Поэтому твои 3 сек будут умножены на количество записей основного запроса. Хранимая процедура или EB в котором эти запросы разделены на 2 поможет.

Для понимания поможет вот эта статейка http://www.ibase.ru/devinfo/dataaccesspaths.htm
...
Рейтинг: 0 / 0
выборка данных из 2 связанных таблиц с несколькими sum функциями
    #38768993
Фотография des1roer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
что за вычисляемый индекс д+т?
...
Рейтинг: 0 / 0
выборка данных из 2 связанных таблиц с несколькими sum функциями
    #38769002
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
выборка данных из 2 связанных таблиц с несколькими sum функциями
    #38770147
Фотография des1roer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: sql
1.
2.
3.
4.
5.
6.
7.
CREATE [UNIQUE] [ASC[ENDING] | [DESC[ENDING]] INDEX indexname
   ON tablename
   { (<col> [, <col> ...]) | COMPUTED BY (expression) }

CREATE  INDEX indexname
   ON tablename
    COMPUTED BY (d+t)


так что ли
...
Рейтинг: 0 / 0
выборка данных из 2 связанных таблиц с несколькими sum функциями
    #38770159
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
des1roer,

вроде того. А ещё лучше если добавить в таблицу обычный столбец типа TIMESTAMP и вычислять его в триггерах before insert, before update. Тогда можно будет обычный индекс вешать, да и запрос упростится.
...
Рейтинг: 0 / 0
выборка данных из 2 связанных таблиц с несколькими sum функциями
    #38770169
Фотография des1roer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
таблица не моя - единственное что могу - это дергать селектом. может ну его в болото, ложить в постгрес и уж оттуда выгребать нужные данные... млин а индекс не положит базу?
...
Рейтинг: 0 / 0
выборка данных из 2 связанных таблиц с несколькими sum функциями
    #38770171
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
des1roer,

индекс не может положить базу. Разве что вставка записей немного замедлится.
...
Рейтинг: 0 / 0
выборка данных из 2 связанных таблиц с несколькими sum функциями
    #38770182
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
des1roer,

вот этот блок поможет

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
EXECUTE BLOCK
RETURNS (
  BYDATE TIMESTAMP
)
AS
  DECLARE TEMP_DATE TIMESTAMP;
BEGIN
  SELECT
    MAX(P.D + P.T)
  FROM
    PROTOKOL P
    LEFT OUTER JOIN CARGO CARGO1 ON (P.FK_CARGO = CARGO1.ID_CARGO)
  WHERE P.D + P.T > '07.10.2014 8:00:00'
    AND P.D + P.T < '07.10.2014 20:00:00'
    AND CARGO1.NAME_CARGO = 'Магнетитовая'
  INTO :TEMP_DATE;

  SELECT
    MAX(P.D + P.T)
  FROM
    PROTOKOL P
    LEFT OUTER JOIN CARGO CARGO1 ON (P.FK_CARGO = CARGO1.ID_CARGO)
  WHERE P.D + P.T > :TEMP_DATE
    AND P.D + P.T < '07.10.2014 23:00:00'
    AND CARGO1.NAME_CARGO = 'Магнет. порожняк'
  INTO :BYDATE;
  SUSPEND;
END
...
Рейтинг: 0 / 0
выборка данных из 2 связанных таблиц с несколькими sum функциями
    #38770210
Фотография des1roer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов Денис,
прошу заметить у меня какашка firebird 1.5.
Ругается
Can't format message 13:896 -- message system code -4.
Dynamic SQL Error.
SQL error code = -104.
Token unknown - line 1, column 9.
BLOCK.
(3,417 с)
...
Рейтинг: 0 / 0
выборка данных из 2 связанных таблиц с несколькими sum функциями
    #38770219
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
тогда делай процедуру.
...
Рейтинг: 0 / 0
выборка данных из 2 связанных таблиц с несколькими sum функциями
    #38770276
Фотография des1roer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ну его на кол этот таймстамп
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
 SELECT
            FIRST 1 D + T            
            FROM PROTOKOL
             left outer join CARGO CARGO1 on (PROTOKOL.FK_CARGO = CARGO1.ID_CARGO)
            where 
             (    D +  T >  
           (
            SELECT
            FIRST 1 D + T  
            FROM PROTOKOL
            left outer join CARGO CARGO1 on (PROTOKOL.FK_CARGO = CARGO1.ID_CARGO)
            where 
          (D = '07.10.2014' and  T >  '8:00:00' and T <  '20:00:00' ) 
           and NAME_CARGO = 'Магнетитовая'
            order by D + T desc
             ) 
            and  D = '07.10.2014' and  T <  '23:00:00'  )       
            and NAME_CARGO = 'Магнет. порожняк'


------ QUERY PERFORMANCE ------
Prepare : 16 мс
Execute : 31 мс
Avg fetch time: 23 мс
...
Рейтинг: 0 / 0
выборка данных из 2 связанных таблиц с несколькими sum функциями
    #38770300
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
des1roer,

вычисляемый индекс помог?

FIRST 1 D + T в основном запросе без ORDER BY D + T (ASC или DESC) может дать бредятину
...
Рейтинг: 0 / 0
выборка данных из 2 связанных таблиц с несколькими sum функциями
    #38770339
Фотография des1roer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
у меня фб на него ругается. без него
...
Рейтинг: 0 / 0
выборка данных из 2 связанных таблиц с несколькими sum функциями
    #38770343
Фотография des1roer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ой че опять за бида
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
select 
(
select SUM (BRUTTO)
from PROTOKOL
left outer join CARGO CARGO1 on (PROTOKOL.FK_CARGO = CARGO1.ID_CARGO)
left outer join STATION STATION1 on (PROTOKOL.FK_STATION = STATION1.ID_STATION)
where 
      (D = '07.10.2014' and  T >  '8:00:00' and T <  '21:00:00' ) 
 and NAME_CARGO = 'ГБРУ' 
 )
 - 
 (
select SUM (BRUTTO)
from PROTOKOL
left outer join CARGO CARGO1 on (PROTOKOL.FK_CARGO = CARGO1.ID_CARGO)
left outer join STATION STATION1 on (PROTOKOL.FK_STATION = STATION1.ID_STATION)
where 
      (D = '07.10.2014' and  T >  '8:00:00' and T <  '21:00:00' ) 
 and NAME_CARGO = 'ГБРУ порожняк' 
 ) from PROTOKOL


как вычесть два числа?
...
Рейтинг: 0 / 0
выборка данных из 2 связанных таблиц с несколькими sum функциями
    #38770350
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
des1roer,


Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
select 
(
select SUM (BRUTTO)
from PROTOKOL
left outer join CARGO CARGO1 on (PROTOKOL.FK_CARGO = CARGO1.ID_CARGO)
left outer join STATION STATION1 on (PROTOKOL.FK_STATION = STATION1.ID_STATION)
where 
      (D = '07.10.2014' and  T >  '8:00:00' and T <  '21:00:00' ) 
 and NAME_CARGO = 'ГБРУ' 
 )
 - 
 (
select SUM (BRUTTO)
from PROTOKOL
left outer join CARGO CARGO1 on (PROTOKOL.FK_CARGO = CARGO1.ID_CARGO)
left outer join STATION STATION1 on (PROTOKOL.FK_STATION = STATION1.ID_STATION)
where 
      (D = '07.10.2014' and  T >  '8:00:00' and T <  '21:00:00' ) 
 and NAME_CARGO = 'ГБРУ порожняк' 
 ) from RDB$DATABASE
...
Рейтинг: 0 / 0
выборка данных из 2 связанных таблиц с несколькими sum функциями
    #38770356
Фотография des1roer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ясно
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
select first 1
(
select SUM (BRUTTO)
from PROTOKOL
left outer join CARGO CARGO1 on (PROTOKOL.FK_CARGO = CARGO1.ID_CARGO)
where 
      (D = '07.10.2014' and  T >  '8:00:00' and T <  '21:00:00' ) 
 and NAME_CARGO = 'ГБРУ' 
 )
 - 
   (
select SUM (BRUTTO)
from PROTOKOL
left outer join CARGO CARGO1 on (PROTOKOL.FK_CARGO = CARGO1.ID_CARGO)
where 
      (D = '07.10.2014' and  T >  '8:00:00' and T <  '21:00:00' ) 
 and NAME_CARGO = 'ГБРУ порожняк' 
 )
  from PROTOKOL
...
Рейтинг: 0 / 0
выборка данных из 2 связанных таблиц с несколькими sum функциями
    #38770358
Фотография des1roer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов Денис,
спасибо, у вас как-то симпотишней решение выглядит
...
Рейтинг: 0 / 0
выборка данных из 2 связанных таблиц с несколькими sum функциями
    #38770371
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
des1roerу вас как-то симпотишней решение выглядит
Лично меня тошнит от обоих. Я бы использовал CASE и никаких подзапросов.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
выборка данных из 2 связанных таблиц с несколькими sum функциями
    #38770382
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov,

я не думал. Лень
...
Рейтинг: 0 / 0
выборка данных из 2 связанных таблиц с несколькими sum функциями
    #38770398
Фотография des1roer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov,
и как же
...
Рейтинг: 0 / 0
выборка данных из 2 связанных таблиц с несколькими sum функциями
    #38770404
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
des1roer,

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
select SUM (CASE 
                    WHEN NAME_CARGO = 'ГБРУ' THEN BRUTTO
                    WHEN NAME_CARGO = 'ГБРУ порожняк' THEN -BRUTTO
                 END)
from PROTOKOL
left outer join CARGO CARGO1 on (PROTOKOL.FK_CARGO = CARGO1.ID_CARGO)
where 
      (D = '07.10.2014' and  T >  '8:00:00' and T <  '21:00:00' ) 
 and NAME_CARGO IN ('ГБРУ', 'ГБРУ порожняк') 
...
Рейтинг: 0 / 0
выборка данных из 2 связанных таблиц с несколькими sum функциями
    #38770407
m7m
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
des1roerи как же

ну как-то вот так
Код: sql
1.
2.
3.
4.
5.
6.
select SUM (BRUTTO * case when NAME_CARGO = 'ГБРУ' then  1 else -1 end)
from PROTOKOL
left outer join CARGO CARGO1 on (PROTOKOL.FK_CARGO = CARGO1.ID_CARGO)
where 
      (D = '07.10.2014' and  T >  '8:00:00' and T <  '21:00:00' ) 
 and NAME_CARGO in ( 'ГБРУ', 'ГБРУ порожняк') 

...
Рейтинг: 0 / 0
выборка данных из 2 связанных таблиц с несколькими sum функциями
    #38770428
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
m7m and NAME_CARGO in ('ГБРУ', 'ГБРУ порожняк')
Не факт, что это условие нужно здесь.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
выборка данных из 2 связанных таблиц с несколькими sum функциями
    #38770481
m7m
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakovm7m and NAME_CARGO in ('ГБРУ', 'ГБРУ порожняк')
Не факт, что это условие нужно здесь.


Да я без понятия, что там нужно и что нет.
И не особо оно меня интересует.
он хотел пример сумм с кэйсом я ему его и нарисовал
...
Рейтинг: 0 / 0
выборка данных из 2 связанных таблиц с несколькими sum функциями
    #38771358
Фотография des1roer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
как правильно записать?
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
select 
(
select SUM (BRUTTO)
from PROTOKOL p
left outer join CARGO CARGO1 on (PROTOKOL.FK_CARGO = CARGO1.ID_CARGO)
left outer join OBJECT OBJECT1 on (PROTOKOL.FK_OBJECT = OBJECT1.ID_OBJECT)
where 
      (p.D = '07.10.2014' and p.T > '11:21:12' ) 
 and NAME_CARGO = 'Магнетитовая'
 )
 - 
 (
select SUM (BRUTTO)
from PROTOKOL p
left outer join CARGO CARGO1 on (PROTOKOL.FK_CARGO = CARGO1.ID_CARGO)
left outer join OBJECT OBJECT2 on (PROTOKOL.FK_OBJECT = OBJECT1.ID_OBJECT)
where 
       (p.D = '07.10.2014' and p.T > '11:21:12' ) 
 and NAME_CARGO = 'Магнет. порожняк'  
 ) from RDB$DATABASE
 where OBJECT1.STATE_NUMBER = OBJECT2.STATE_NUMBER
...
Рейтинг: 0 / 0
выборка данных из 2 связанных таблиц с несколькими sum функциями
    #38771385
m7m
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
des1roerкак правильно записать?
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
select 
(
select SUM (BRUTTO)
from PROTOKOL p
left outer join CARGO CARGO1 on (PROTOKOL.FK_CARGO = CARGO1.ID_CARGO)
left outer join OBJECT OBJECT1 on (PROTOKOL.FK_OBJECT = OBJECT1.ID_OBJECT)
where 
      (p.D = '07.10.2014' and p.T > '11:21:12' ) 
 and NAME_CARGO = 'Магнетитовая'
 )
 - 
 (
select SUM (BRUTTO)
from PROTOKOL p
left outer join CARGO CARGO1 on (PROTOKOL.FK_CARGO = CARGO1.ID_CARGO)
left outer join OBJECT OBJECT2 on (PROTOKOL.FK_OBJECT = OBJECT1.ID_OBJECT)
where 
       (p.D = '07.10.2014' and p.T > '11:21:12' ) 
 and NAME_CARGO = 'Магнет. порожняк'  
 ) from RDB$DATABASE
 where OBJECT1.STATE_NUMBER = OBJECT2.STATE_NUMBER



А чем это отличается от предыдущего????
ps/
- Использовать параметры
- изменить малость структуры таблиц дабы не писать каждый раз
NAME_CARGO = 'чего-то там'
NAME_CARGO = 'чего-то там порожняк'
...
Рейтинг: 0 / 0
выборка данных из 2 связанных таблиц с несколькими sum функциями
    #38771401
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
des1roer,

этот запрос вообще бредовый.


Код: sql
1.
left outer join OBJECT OBJECT2 on (PROTOKOL.FK_OBJECT = OBJECT1.ID_OBJECT) 



тут не тот алиас используется в условии соединения

Код: sql
1.
where OBJECT1.STATE_NUMBER = OBJECT2.STATE_NUMBER



нельзя связывать два подзапроса в основном запросе

Учи SQL.
...
Рейтинг: 0 / 0
выборка данных из 2 связанных таблиц с несколькими sum функциями
    #38771424
Фотография des1roer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
да понял как надо
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
 select SUM (BRUTTO * case when NAME_CARGO = 'Магнетитовая' then  1 else -1 end)
from PROTOKOL p
left outer join CARGO CARGO1 on (PROTOKOL.FK_CARGO = CARGO1.ID_CARGO)
left outer join OBJECT OBJECT1 on (PROTOKOL.FK_OBJECT = OBJECT1.ID_OBJECT)
where 
    --  (D = '07.10.2014' and  T >  '8:00:00' and T <  '21:00:00' ) 
        (p.D = '07.10.2014' and p.T > '11:21:12' ) 
 and NAME_CARGO in ( 'Магнетитовая',  'Магнет. порожняк'  ) 
 and OBJECT1.STATE_NUMBER = '55844823'
...
Рейтинг: 0 / 0
выборка данных из 2 связанных таблиц с несколькими sum функциями
    #38771426
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
des1roer,

ах да. Если есть условие по которому идёт фильтрация, то OUTER JOIN явно не нужен.
NAME_CARGO относится к таблице CARGO (вообще в условиях перед полями ставь имена таблиц или алиасов, если в запросе больше 1 таблицы) и
есть условие and NAME_CARGO = 'Магнет. порожняк' в WHERE значит вместо LEFT OUTER JOIN можно использовать INNER JOIN.
...
Рейтинг: 0 / 0
выборка данных из 2 связанных таблиц с несколькими sum функциями
    #38771429
Фотография des1roer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
учту.
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
 select SUM (BRUTTO * case when CARGO1.NAME_CARGO = 'Магнетитовая' then  1 else -1 end)
from PROTOKOL p
INNER JOIN CARGO CARGO1 on (PROTOKOL.FK_CARGO = CARGO1.ID_CARGO)
INNER JOIN OBJECT OBJECT1 on (PROTOKOL.FK_OBJECT = OBJECT1.ID_OBJECT)
where 
    --  (D = '07.10.2014' and  T >  '8:00:00' and T <  '21:00:00' ) 
        (p.D = '07.10.2014' and p.T > '11:21:12' ) 
 and CARGO1.NAME_CARGO in ( 'Магнетитовая',  'Магнет. порожняк'  ) 
 and OBJECT1.STATE_NUMBER = '55844823'
...
Рейтинг: 0 / 0
44 сообщений из 44, показаны все 2 страниц
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / выборка данных из 2 связанных таблиц с несколькими sum функциями
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]