Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Запросик слабенький / 18 сообщений из 18, страница 1 из 1
31.07.2001, 12:45
    #32010767
tors
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запросик слабенький
Ребят, не поможете осилить?
Есть три таблицы:
1. Марка товара(Состав: Марка товара(Pr.Key)).
2. Приход товара(Состав: Марка товара(For.Key), Кол-во прихода).
3. Расход товара(Состав: Марка товара(For.Key), Кол-во расхода).
Необх. составить выборку остатка, состав: Марка товара, остаток товара.
...
Рейтинг: 0 / 0
31.07.2001, 13:02
    #32010770
Genady
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запросик слабенький
Наверное что то типа этого

Select МТ.НазваниеМаркиТовара, (Sum(ПТ.КолПрихода) - Sum(РТ.КолРасхода)) as ОстатокТовара
from МаркаТовара МТ, ПриходТовара ПТ, РасходТовара РТ
where МТ.МаркаТовараИД = ПТ.МаркаТовараИД and МТ.МаркаТовараИД = РТ.МаркаТовараИД
Group by МТ.НазваниеМаркиТовара

...
Рейтинг: 0 / 0
31.07.2001, 13:15
    #32010773
Glory
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запросик слабенький
IMHO нужно использовать LEFT JOIN, т.к. если у товара не было прихода и/или расхода, то он в выборку не попадет

Select МТ.НазваниеМаркиТовара, (Sum(ПТ.КолПрихода) - Sum(РТ.КолРасхода)) as ОстатокТовара
from МаркаТовара МТ
left outer join ПриходТовара ПТ МТ.МаркаТовараИД = ПТ.МаркаТовараИД
left outer join РасходТовара РТ and МТ.МаркаТовараИД = РТ.МаркаТовараИД
Group by МТ.НазваниеМаркиТовара
...
Рейтинг: 0 / 0
31.07.2001, 13:31
    #32010774
Запросик слабенький
Так делать нельзя - перемножение записей получиться.

Вот так можно:

Select
МТ.НазваниеМаркиТовара,
IsNull((select Sum(ПТ.КолПрихода)
from ПриходТовара ПТ
where МТ.МаркаТовараИД=ПТ.МаркаТовараИД),0)
-IsNull((select Sum(РТ.КолРасхода)
from РасходТовара РТ
where МТ.МаркаТовараИД=РТ.МаркаТовараИД),0) as ОстатокТовара
from МаркаТовара МТ
...
Рейтинг: 0 / 0
31.07.2001, 13:34
    #32010776
Genady
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запросик слабенький
2 Глеб Уфимцев
А так разве нельзя?

Select МТ.НазваниеМаркиТовара, (Sum(isnull(ПТ.КолПрихода,0)) - Sum(isnull(РТ.КолРасхода, 0))) as ОстатокТовара
from МаркаТовара МТ
left outer join ПриходТовара ПТ on МТ.МаркаТовараИД = ПТ.МаркаТовараИД
left outer join РасходТовара РТ on МТ.МаркаТовараИД = РТ.МаркаТовараИД
Group by МТ.НазваниеМаркиТовара
...
Рейтинг: 0 / 0
31.07.2001, 13:37
    #32010777
Glory
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запросик слабенький
2 Глеб Уфимцев
>Так делать нельзя - перемножение записей получиться.

А что на что здесь будет перемножаться ?
...
Рейтинг: 0 / 0
31.07.2001, 13:41
    #32010778
Genady
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запросик слабенький
>А что на что здесь будет перемножаться ?

Мне тоже интересно
...
Рейтинг: 0 / 0
31.07.2001, 13:51
    #32010780
SergSuper
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запросик слабенький
А так?
select Марка, sum(Кол_во) from
(select Марка Кол_во from Приход
union
select Марка -Кол_во from Расход ) as s
group by Марка

Вообще я обычно это через временные таблицы делаю
...
Рейтинг: 0 / 0
31.07.2001, 14:02
    #32010781
Genady
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запросик слабенький
2 SergSuper
Мне очень понравился Ваш вариант, если только не бывает ситуации, когда Марка есть а не было ни прихода ни расхода.
...
Рейтинг: 0 / 0
31.07.2001, 14:28
    #32010785
tors
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запросик слабенький
Спасибо за помощь ребята, выручили!!!!!!!!!!!!!!
Судя по предварительным результатам, безошибочные цифры получились у Глеба
Проверял все выборки составленных до SergSuper включ.
...
Рейтинг: 0 / 0
31.07.2001, 14:35
    #32010787
SergSuper
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запросик слабенький
Genady!
Specially for you

select Марка, sum(Кол_во) from
(select Марка, Кол_во from Приход
union
select Марка, -Кол_во from Расход
union
select Марка, 0 from Марка_товара) as s
group by Марка

Я хотел сразу так написать, да потом подумал что и так очевидно как это сделать
...
Рейтинг: 0 / 0
01.08.2001, 10:18
    #32010827
Genady
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запросик слабенький
2 SergSuper

Thank you
Иногда лишний раз подумать бывает лень.
...
Рейтинг: 0 / 0
01.08.2001, 10:53
    #32010838
Запросик слабенький
Раз был вопрос насчет перемножения записей, расскажу в чем дело. Для облегчения понимания упрощу.
Имеем 3 таблицы:
t(tovar) -список товаров - всего один товар (одна запись)
p(tovar,prixod) - приходы товаров - всего два прихода того самого единственного товара по 2 ед. (две записи). Всего пришло, значит, 4 ед.
r(tovar, rashod) - расходы товара - всего три расхода того же товара по 1 ед. (3 записи). Всего, значит, ушло 3 ед.
Остаться, значит, должно 4-3=1 ед.

Запрос типа
select t.tovar, sum(prihod)-sum(rashod) ostatok
from t
left join p on t.tovar=p.tovar
left join r on t.tovar=r.tovar

даст неправильный результат "6", так как такое соединение "t left join p on t.tovar=p.tovar left join r on t.tovar=r.tovar"
выдаст результирующий набор из 6 записей, которые дальше уже будут суммироваться. prihod засуммируется как 2+2+2+2+2+2=12, а rashod - как 1+1+1+1+1+1=6. Чтобы в этом убедится, можно отдельно вывести приход и расход:
select t.tovar, sum(prihod) , sum(rashod)
from t
left join p on t.tovar=p.tovar
left join r on t.tovar=r.tovar

Этот эффект и называется перемножение записей (который наблюдается при джойне 3-х и более таблиц по типу многие-к-одному с двух сторон к стороне "один").

Извините, за некоторую сумбурность. Из меня рассказчик не очень.
...
Рейтинг: 0 / 0
01.08.2001, 10:55
    #32010839
Запросик слабенький
group by пропустил в спешке. звиняйте. смысел остался прежним.
...
Рейтинг: 0 / 0
01.08.2001, 12:49
    #32010882
Genady
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запросик слабенький
>2+2+2+2+2+2

Проверять сейчас некогда, но вот вопрос, а Null-ы куда делись?
...
Рейтинг: 0 / 0
01.08.2001, 12:51
    #32010883
Genady
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запросик слабенький
Все, понял.
...
Рейтинг: 0 / 0
15.08.2001, 05:38
    #32011789
svz58
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запросик слабенький
Для SergSuper
Запрос с Union некорректен.
В Union попадают (по опр.) только различные записи, т.е. если 2 прихода (+2)
то на выходе только одна (+2).
т.е. если +2+2-2-1 то получим в ответе -1
Всего хорошего
...
Рейтинг: 0 / 0
15.08.2001, 05:55
    #32011791
Genady
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Запросик слабенький
>В Union попадают (по опр.) только различные записи,
А если Union All,
...
Рейтинг: 0 / 0
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Запросик слабенький / 18 сообщений из 18, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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