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

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

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

Восстановить пароль
Повторная активизация e-mail

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

Ответ
 
Опции темы Поиск в этой теме
Старый 04.11.2009, 14:49   #1
itsme58
 
Регистрация: 04.11.2009
Сообщений: 7
По умолчанию Выборка сумм за сутки и период

Есть таблица:
- дата продажи
- изделие
- цвет изделия
- стоимость
За сутки может быть несколько одинаковых записей!
Помогите создать SQL запрос для выборки в виде:
- изделие
- цвет изделия
- стоимость проданных изделий определенного цвета за указанную дату
- стоимость проданных изделий определенного цвета с начала месяца.

Спасибо.
itsme58 вне форума Ответить с цитированием
Старый 04.11.2009, 15:37   #2
mihali4
*
Старожил
 
Регистрация: 22.11.2006
Сообщений: 9,201
По умолчанию

А поискать по форуму - не судьба?
http://www.programmersforum.ru/showt...E5%F0%E8%EE%E4
http://www.programmersforum.ru/showt...E5%F0%E8%EE%E4
Еще? Или может самостоятельно введете в строку поиска слово "период" и поищете остальное в разделе "SQL" ?
mihali4 вне форума Ответить с цитированием
Старый 05.11.2009, 09:17   #3
itsme58
 
Регистрация: 04.11.2009
Сообщений: 7
По умолчанию

>А поискать по форуму - не судьба?

Искал. Пока, действительно, не судьба.

>http://www.programmersforum.ru/showt...E5%F0%E8%EE%E4
>http://www.programmersforum.ru/showt...E5%F0%E8%EE%E4

Обе ссылки - мимо кассы. Первая: простое суммирование за период,
вторая - более сложное суммирование, опять же за период.

>Еще? Или может самостоятельно введете в строку поиска ?>слово "период" и поищете остальное в разделе "SQL" ?

Мне не нужно за "период". Мне нужно за "два периода" _одним_запросом_.
Похожим на этот, но работающий:

SELECT t1.name, t1.color,
(SELECT SUM(t2.price) FROM table t2 WHERE t2.date='09.11.25'
GROUP BY t2.name, t2.color),
(SELECT SUM(t1.price) FROM table t1 WHERE t1.date>='09.11.01'
AND t1.date<='09.11.25' GROUP BY t1.name, t1.color),
FROM table t1, table t2
WHERE t2.name(+)=t1.name AND t2.color(+)=t1.color
itsme58 вне форума Ответить с цитированием
Старый 05.11.2009, 09:41   #4
soleil@mmc
SQL-коддинг
Участник клуба
 
Регистрация: 16.01.2009
Сообщений: 1,192
По умолчанию

ну и делай общий запрос с группировкой по изделие, цвет изделия
и подзапрос в нем же на нахождение стоимости проданных изделий определенного цвета с начала месяца

З.Ы.: субд/версия?
soleil@mmc вне форума Ответить с цитированием
Старый 05.11.2009, 10:14   #5
itsme58
 
Регистрация: 04.11.2009
Сообщений: 7
По умолчанию

>З.Ы.: субд/версия?

Oracle 7.1.6.2.0

Уточнение.
Исходные данные в таблице: date, name, color, price
Результат должен получиться в виде:

name color sum(price) за сегодня sum(price) за месяц
------ ----- --------------------- --------------------
мячик желтый 0.00 25.50
кубик желтый 15.25 45.75
кубик зеленый 0.00 30.50

и т.д.
itsme58 вне форума Ответить с цитированием
Старый 05.11.2009, 12:07   #6
soleil@mmc
SQL-коддинг
Участник клуба
 
Регистрация: 16.01.2009
Сообщений: 1,192
По умолчанию

кагтотаг
Код:
with 
  t as (
  select 'мячик' name, 'желтый' color, 5.5 price, to_date('01.11.2009', 'DD.MM.YYYY') i_date from dual union all
  select 'мячик', 'зеленый', 6.0, to_date('01.11.2009', 'DD.MM.YYYY') from dual union all
  select 'кубик', 'зеленый', 6.5, to_date('01.11.2009', 'DD.MM.YYYY') from dual union all
  select 'кубик', 'желтый', 7.0, to_date('01.11.2009', 'DD.MM.YYYY') from dual union all
  select 'мячик', 'зеленый', 6.0, to_date('10.11.2009', 'DD.MM.YYYY') from dual union all
  select 'мячик', 'желтый', 7.0, to_date('10.11.2009', 'DD.MM.YYYY') from dual union all
  select 'кубик', 'зеленый', 6.0, to_date('10.11.2009', 'DD.MM.YYYY') from dual union all
  select 'кубик', 'желтый', 7.0, to_date('10.11.2009', 'DD.MM.YYYY') from dual union all
  select 'мячик', 'зеленый', 5.5, to_date('10.11.2009', 'DD.MM.YYYY') from dual union all
  select 'мячик', 'желтый', 6.0, to_date('10.11.2009', 'DD.MM.YYYY') from dual
  )
  
select 
  name,
  color,
  sum(price) amount_by_date,
  (select sum(t2.price) 
   from t t2 
   where 0=0
     and t2.name = t.name
     and t2.color = t.color
     and trunc(t2.i_date, 'mm') = trunc(to_date(:p0, 'DD.MM.YYYY'), 'mm')) amount_by_month
from t
where 0=0
  and i_date = to_date(:p0, 'DD.MM.YYYY')
group by name, color
order by name, color
soleil@mmc вне форума Ответить с цитированием
Старый 05.11.2009, 12:38   #7
itsme58
 
Регистрация: 04.11.2009
Сообщений: 7
По умолчанию

Грязно ругается на вложенный select:
ORA-00936: missing expression
itsme58 вне форума Ответить с цитированием
Старый 05.11.2009, 13:04   #8
soleil@mmc
SQL-коддинг
Участник клуба
 
Регистрация: 16.01.2009
Сообщений: 1,192
По умолчанию

ничего такого специфического для 7ки я не юзал
так что просто проверь все именования полей и таблиц - чтобы были реальные
если чота непонятно, то комменть текст запроса построчно/поблочно чтобы общий запрос выполнялся и смотри что он там делает
soleil@mmc вне форума Ответить с цитированием
Старый 05.11.2009, 13:35   #9
itsme58
 
Регистрация: 04.11.2009
Сообщений: 7
По умолчанию

Спасибо. Все понятно. Я выше приводил похожий запрос. Но каждый select отдельно работает, а во вложенном виде, ругается.
itsme58 вне форума Ответить с цитированием
Старый 05.11.2009, 14:21   #10
soleil@mmc
SQL-коддинг
Участник клуба
 
Регистрация: 16.01.2009
Сообщений: 1,192
По умолчанию

Цитата:
Сообщение от itsme58 Посмотреть сообщение
Я выше приводил похожий запрос.
"похожий запрос" вернет тебе на каждую строку данных основного запроса столько же строк в подзапросе
и имхо там внешние объединения ни к чему - проще сумму обернуть нвл-ом (nvl(sum(price), 0))
soleil@mmc вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Период дроби! prosport91 Паскаль, Turbo Pascal, PascalABC.NET 0 09.06.2009 15:57
Период дроби Магистраль Помощь студентам 7 06.04.2009 09:11