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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 14.02.2013, 20:55   #1
Ardarik
Пользователь
 
Регистрация: 16.01.2011
Сообщений: 80
По умолчанию Остатки на складе

Есть таблица name (Наименование товара), таблица arrival (Приход) и use (расход). Нужно узнать остатки на складе.
Код:
SELECT name.`Наименование` as `Наименование`,
sum(arrival.`Количество`)
FROM  name,  arrival
where  name.`id_наименование` = arrival.`Наименование`
group by name.`id_наименование`
Сколько пришло пишет правильно, а
Код:
SELECT name.`Наименование` as `Наименование`,
sum(arrival.`Количество`)-sum(`use`.`Количество`)
FROM  name,  arrival, `use`
where  name.`id_наименование` = arrival.`Наименование` 
group by name.`id_наименование`
когда пытаюсь посчитать остатки то считает не правильно.
Что не правильно в запросе?
Ardarik вне форума Ответить с цитированием
Старый 14.02.2013, 21:20   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,792
По умолчанию

Цитата:
group by name.`id_наименование`
Стесняюсь спросить, мускул пропускает такую группировку без проблем? Его не смущает что список полей в группе не совпадает со списком полей в выходном наборе?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 14.02.2013, 21:27   #3
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 19,042
По умолчанию

1. USE ни как не связано с name и arrival - получишь суперпозицию
2. Даже если свяжешь получишь не правильно
3. Входящих остатков нет???
4, Очень плохо наименование в качестве первичного ключа
5. Без входящих остатков можно, например, так
Код:
  SELECT name.`Наименование` as `Наименование`,
    COALESCE((SELECT SUM(arrival.`Количество`) FROM arrival WHERE name.`id_наименование` = arrival.`Наименование`),0)-
    COALESCE((SELECT SUM(`use`.`Количество`) FROM use WHERE name.`id_наименование` = use.`Наименование` ),0) AS Ostat
    FROM  name
ADD

id_наименование и наименование тоже не понял

Stilet, MYSQL в принципе допускает с оговорками конструкции вида
Код:
SELECT id,name ... GROUP BY id
http://www.weblibrary.biz/mysql/funk.../skrytye-polya
возможно 1_ый запрос у ТС и работает по этой причине
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию

Последний раз редактировалось Аватар; 14.02.2013 в 21:41.
Аватар вне форума Ответить с цитированием
Старый 15.02.2013, 17:15   #4
Ardarik
Пользователь
 
Регистрация: 16.01.2011
Сообщений: 80
По умолчанию

При заполнении таблицы use и arrival значение Наименование беру из name.`id_наименование`
Ardarik вне форума Ответить с цитированием
Старый 15.02.2013, 20:04   #5
Ardarik
Пользователь
 
Регистрация: 16.01.2011
Сообщений: 80
По умолчанию

Как работает функция COALESCE()? И для чего ноль вторым аргументом?
Ardarik вне форума Ответить с цитированием
Старый 15.02.2013, 20:30   #6
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 19,042
По умолчанию

Цитата:
Как работает функция COALESCE()? И для чего ноль вторым аргументом?
MySQL COALESCE в гугл в три быстрей было бы забить, чем набрать текст вопроса
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 15.02.2013, 20:37   #7
Ardarik
Пользователь
 
Регистрация: 16.01.2011
Сообщений: 80
По умолчанию

Из всего понял только что SELECT COALESCE(col,X) FROM table
Это функция, которая заменяет значение на X, если col возвращает NULL
А прежде чем задать вопрос сначала искал в гугле. Ну щас вроде дошло. В запросе нет ни какой группировки данных
Ardarik вне форума Ответить с цитированием
Старый 15.02.2013, 20:42   #8
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 19,042
По умолчанию

Группировка в подзапроосах есть и, если хотя бы один из подзапросов вернет NULL, то и разница будет NULL. COALESCE и обходит это
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 15.02.2013, 20:44   #9
Ardarik
Пользователь
 
Регистрация: 16.01.2011
Сообщений: 80
По умолчанию

Спасибо теперь ясно стало
Ardarik вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Среднее значение нахождения на складе Mirdoom Microsoft Office Excel 1 14.01.2013 08:56
Товар на складе ЧАК Помощь студентам 1 23.06.2012 22:38
число ящиков на складе ololo-schoolboy Общие вопросы C/C++ 0 12.03.2011 21:49
Остатки вируса HellMercenariess Безопасность, Шифрование 2 14.09.2010 04:14
проблема с реализацией на складе 4321 БД в Delphi 3 30.10.2008 13:30