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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 16.10.2011, 21:43   #1
Kolik317
Пользователь
 
Регистрация: 14.08.2009
Сообщений: 64
По умолчанию Количество полей

Есть две таблицы - 1)Категория(category) и 2)Товар-категория(tovcat)
1) столбцы id|cname
2) tov_id(id товара)|cat_id(id категории)

Надо вывести количество товаров в каждой категории( один товар может сразу быть в нескольких категориях).
Надо получить таблицу id|cname|количество
Делаю такой запрос - всё работает
Код:
SELECT tc.cat_id, COUNT(tc.tov_id) AS quin
FROM tovcat AS tc
GROUP BY cat_id;
Теперь надо добавить поле название категории - делаю так:
Код:
SELECT tc.cat_id, k.cname, COUNT(tc.tov_id) AS quin
FROM tovcat AS tc, categories AS k
WHERE tc.cat_id=k.id
GROUP BY cat_id;
Ничего не работает, ругается на cname. Запросы делаю в access.
Наверно нужно использовать join, но у меня ничего не получается

Последний раз редактировалось Kolik317; 16.10.2011 в 23:16.
Kolik317 вне форума Ответить с цитированием
Старый 17.10.2011, 00:47   #2
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Код:
SELECT tc.cat_id, k.cname, COUNT(tc.tov_id) AS quin
FROM tovcat AS tc, categories AS k
WHERE tc.cat_id=k.id
GROUP BY tc.cat_id, k.cname;

p.s. извините, я писал чисто автоматически - по правилам SQL - не разбирая, что и из каких таблиц Вы выбираете. Поэтому логику запроса проверяйте самостоятельно. я лишь сделал так, чтобы он работал.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 17.10.2011, 03:37   #3
Kolik317
Пользователь
 
Регистрация: 14.08.2009
Сообщений: 64
По умолчанию

Спасибо большое, это то что надо.
Еще одно, не хочу новую тему создавать из за нуб вопросов.
Есть три таблицы
Код:
Покупатель
id|fname
покупка
id|product_id(id товара)|buyer_id( покупателя)
товары
id|price(цена)
Надо вывести покупателя, и сумму на которую он совершил покупок.

Вот что я пытался сделать:
Код:
SELECT b.fname, sum(p.price)
FROM buyers AS b, purchases AS p, product AS pr
WHERE p.buyer_id=b.id AND p.product_id=pr.id
GROUP BY b.fname
Выводит просто имена покупателей, и пустое поле вместо суммы.

Последний раз редактировалось Kolik317; 17.10.2011 в 03:40.
Kolik317 вне форума Ответить с цитированием
Старый 17.10.2011, 08:31   #4
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

проверяйте данные (например, уберите группировку и выполните запрос оп всем полям:
Код:
SELECT * 
FROM buyers AS b, purchases AS p, product AS pr
WHERE p.buyer_id=b.id AND p.product_id=pr.id
я на 99% уверен, что проблема в самих данных (либо не туда ссылки ведут, либо цены пустые).


ну и ещё. если это не учебное задание, а Вы проектируете задачу, то спешу Вас огорчить (надеюсь, что ещё не поздно изменить/доработать)!
Цена товара - это не сумма покупки! В покупке (таблица purchases ) должно быть количество товара (это как минимум). А как максимум и цена и сумма покупки. Да и дата покупки явно не помешает.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 17.10.2011, 16:14   #5
Kolik317
Пользователь
 
Регистрация: 14.08.2009
Сообщений: 64
По умолчанию

А смысл выводить количество товара, если он разный и с разной ценой?
Дата естественно есть, это упрощенная же версия.
Я хотел чтобы можно было выводить информацию, как на чеке в супермаркете - каждый купленный товар, его цена, и общая сумма.
Получается надо либо делать еще одну таблицу чтобы было
получатель-покупка-покупка_товар-товар, или так же считать суммой, и в одной покупке будет только один товар, а всю покупку клиента за день просто смотреть по дате.
Kolik317 вне форума Ответить с цитированием
Старый 17.10.2011, 16:57   #6
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Я хотел чтобы можно было выводить информацию, как на чеке в супермаркете - каждый купленный товар, его цена, и общая сумма.
ну и я о том же!
Цена и сумма за этот товар - это разные вещи!
Вы, когда покупаете 12 бутылочек пива - в одной строчке написана цена за ОДНУ бутылочку, потом количество - потом общая стоимость ДВЕНАДЦАТИ бутылочек.
или в Вашем чеке будет 12 строчек?!

Так всё равно не покатит.
А если Вы полкило креветок возьмёте - в чеке будет цена за килограм + вес, не так ли?!
Serge_Bliznykov вне форума Ответить с цитированием
Старый 17.10.2011, 18:39   #7
Kolik317
Пользователь
 
Регистрация: 14.08.2009
Сообщений: 64
По умолчанию

Так если у меня в схеме в одной "покупке" только один товар?
Получается сейчас я в чек вывожу список покупок за день(час,минуту), тоесть
Бутылка пива 100р
Бутылка пива 100р
Бутылка пива 100р
Бутылка водки 200р
Потом просто суммирую поля покупок за этот день и получается что сумма покупки 500р. Это плохо?
А делать чтобы в покупке был так же только один товар разного количества, не вижу смысла, особого удобства не добавит.
Лучше тогда схема получатель-покупка-покупка_товар-товар, тогда за покупку будет считаться один приход в магазин, за который он мог купить любое количество разного товара.
Цитата:
А как максимум и цена и сумма покупки.
Тоесть суммировать стоимость выбранных товаров еще при вводе и заносить её чтоли?
Kolik317 вне форума Ответить с цитированием
Старый 17.10.2011, 19:23   #8
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

А можно (и нужно) держать:
Бутылка пива 3, ед.изм шт, цена 100р
Бутылка водки 1, ед.изм шт, цена 200р
Селедка 1.43, ед.изм кг, цена 150р

А стоимость тоже можно держать, а можно и запросом рассчитывать как округленное до копеек произведение количества на цену
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 17.10.2011, 23:13   #9
Kolik317
Пользователь
 
Регистрация: 14.08.2009
Сообщений: 64
По умолчанию

Так и сделал. Спасибо
Подскажите еще.
Вот запрос
Код:
SELECT p.client_id, b.fname, b.sname, sum(pr.price*pp.quantity) AS pprice
FROM purchases p, purchprod pp, products pr, buyers b
WHERE p.id=pp.purch_id AND pp.prod_id=pr.id AND b.id=p.client_id 
GROUP BY p.client_id, pprice, b.fname, b.sname
Работает как надо, но аксесс просит ввести pprice. Оставляю пустым, всё работает как надо.
Теперь хочу чтобы он вывел строки, у которых будет pprice>3000( такие точно есть)
и добавляю в WHERE pprice>3000.
И он не выводит ни одного поля. Тоесть он как-то не понимает что за поле pprice. Наверно это особенности аксеса. Как победить?


UPD всё, нашел, спасибо этому форуму.
Условие это надо ставить в HAVING
Код:
SELECT p.client_id, b.fname, b.sname, sum(pr.price*pp.quantity) AS pprice
FROM purchases p, purchprod pp, products pr, buyers b
WHERE p.id=pp.purch_id AND pp.prod_id=pr.id AND b.id=p.client_id
GROUP BY p.client_id,  b.fname, b.sname
HAVING sum(pr.price*pp.quantity)>3000

Последний раз редактировалось Kolik317; 17.10.2011 в 23:42.
Kolik317 вне форума Ответить с цитированием
Старый 18.10.2011, 00:35   #10
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Спасибо в основном Serge_Bliznykov, он вас упорно убеждал. А стоимость лучше с округлением до копейки считать или до рубля, если копейки не в ходу, причем по каждой позиции, а не результат SUM округлять. Что выдаст например 1.333*17=22.661. Обычно у СУБД бывает функция округления
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Задана последовательность чисел в формате:сначала количество цифр в числе, потом - цифры числа. Подсчитать количество. Arn1 Помощь студентам 4 03.10.2011 20:03
При удалении записей значения полей с type:=Autoincrement (т.е+) в оставшихся полей не изменяются kenta БД в Delphi 2 29.10.2009 08:28
Объеденение полей запроса в для отображения нескольких полей в одном списке mrCreator Microsoft Office Access 3 08.08.2009 00:53
количество цифр и количество символов до первой гласной буквы 111111 Общие вопросы C/C++ 2 22.12.2008 12:15