Вопросик по SQL
7341
41
Может кто подскажет.
Есть таблица, типа:

name type sum

Вася болт 1
Петя гайка 1
Коля болт 2
Катя гвоздь 10
Вася шуруп 4
Коля гайка 5
Света шуруп 1

Надо сделать хитрый SELECT, чтоб sum у одинаковых имен сложился и получился вывод типа:
name sum
Вася 5
Петя 1
Коля 7
Катя 10
Света 1

type выводить ненадо, только name и sum. При этом сами данные менять нельзя, работаем только с выводом. Возможно ли такое сделать с помощью SELECT? Может кто подскажет вариант?
Fender
Чего ж тут хитрого?

SELECT name, SUM(sum)
FROM table
GROUP BY name
Fender
Чтобы такие селекты не казались хитрыми, почитайте небольшую книжицу http://www.sql.ru/docs/sql/u_sql/
jack_solovey
Чтобы такие селекты не казались хитрыми, почитайте небольшую книжицу http://www.sql.ru/docs/sql/u_sql
"Предположим что вы хотите знать какие продавцы в настоящее время имеют свои порядки в таблице Порядков."
...
...
"SELECT snum FROM Orders; "

АААА!!!!
jack_solovey
Чтобы такие селекты не казались хитрыми, почитайте небольшую книжицу http://www.sql.ru/docs/sql/u_sql/
Лучше вот это:
sql-ex.ru :live:
Fender
Надо сделать хитрый SELECT, чтоб sum у одинаковых имен сложился и получился вывод
Такой таблицы быть не может. Потому что не может быть одинаковых уникальных имен/наименований в базе данных.
IEEE
"Предположим что вы хотите знать какие продавцы в настоящее время имеют свои порядки в таблице Порядков."
"Переводчик не известен."

Известен. Это компьютер перевел.
kostyanet
Такой таблицы быть не может. Потому что не может быть одинаковых уникальных имен/наименований в базе данных.
Хотите я вам такую таблицу покажу? ну чтобы вы не говорили, что "такой быть не может".
и где вы прочили про уникальность?
KSergey
Ну не успел еще человек про владельцев объектов и про полное имя объекта почитать. Ну чего сердиться-то :biggrin:
ХочуСпросить
Ну не успел еще человек про владельцев объектов и про полное имя объекта почитать
Речь, как я понял, про строки в таблице с идентичным содержимым, а не про объекты (таблицы) БД.
KSergey
Стоп. Похоже это я по диагонали прочитал... :dnknow:
KSergey
Хотите я вам такую таблицу покажу? ну чтобы вы не говорили, что "такой быть не может".
и где вы прочили про уникальность?
Вы не читали, поэтому и задаете такие вопросы. Автор темы тоже не читал. Поэтому в национальном масштабе мы юзаем екзель.

Когда вы приходите в контору где есть клиентская база вам задают вопрос: вы у нас бывали? Если задают, значит там правильная культура. Если не задают: там дебилы и база данных им не нужна.

Каждый факт хранится в базе в единственном экземпляре. Если как в примере автора Вася фигурирует несколько раз, это не реляционная база данных и не надо мучиться с SQL'ем. Надо просто скопипастить ее в екзель и фильтрами корежить.
kostyanet
Довольно странно что приходится такие вещи объяснять после ссылок на документацию.

name type sum

Вася болт 1
Петя гайка 1
Коля болт 2
Катя гвоздь 10
Вася шуруп 4
Коля гайка 5
Света шуруп 1
Это минимум 3 таблицы: товары, покупаны, заказы. Заказы связывают таблицы покупаны и товары и содержит поля товарИД и количество. Идентификатор отдельного заказа может быть датой, или числом. Но придется его размножать на каждую позицию. Можно не плодить эти лишние сущности и поделить заказы на заказы и заказ которые связываются по заказИД. То есть 4 таблицы: товары, покупаны, заказы, заказ. В каждой сугубо уникальные данные.

А вот зачем суммировать количество разных артикулов: ума не приложу. Скорее всего автор интерпрентировал задачу так, чтобы скрыть истинную цель.

Сделать это будет легко: суммируем все поля количество в заказе выбранном по заказаИД из таблицы заказы выбранной по покупанИД.
kostyanet
А вот зачем суммировать количество разных артикулов: ума не приложу. Скорее всего автор интерпрентировал задачу так, чтобы скрыть истинную цель.

Сделать это будет легко: суммируем все поля количество в заказе выбранном по заказаИД из таблицы заказы выбранной по покупанИД.
Я извиняюсь, зачем усложнять и удаляться от сабжа? Реквест на хелп был с четко сформированным заданием: "Можно ли сделать так, если дано вот так?". Первый же ответ был: "Можно". Вы имеете поспорить, что в скулевой таблице так нельзя сохранить данные? Или нельзя их так выбрать? Зачем это автору - другой вопрос. Мое мнение - просто упражнение, скажем, на курсе "Базы данных", именно на использование SUM() и GROUP BY в запросах...
PN
Ну вот, пришел модер и стало скучно... а я только пивом затарился...

автору, тоже : :pivo:
tolstopuz
Блин, я ж тут модератор, точно... А я-то и не вспомнил с разгону, зачем я в раздел залез и зачем написал...
kostyanet
Если как в примере автора Вася фигурирует несколько раз, это не реляционная база данных и не надо мучиться с SQL'ем
Очень спорное утверждение.
Основные задачи проектирования баз данных

Основные задачи:
Обеспечение хранения в БД всей необходимой информации.
Обеспечение возможности получения данных по всем необходимым запросам.
Сокращение избыточности и дублирования данных.
Обеспечение целостности данных (правильности их содержания): исключение противоречий в содержании данных, исключение их потери и т.д.

вам бы вот это почитать хотя бы с википедии
Сокращение != устранение.
Наличие избыточности данных
а) всегда бывает плохо с точки зрения теории и структуры
б) иногда хорошо с точки зрения производительности при эксплуатации
Опять же - наличие или отсутствие избыточности ничего не говорит о реляционности модели данных.
kostyanet
Вы не читали, поэтому и задаете такие вопросы. Автор темы тоже не читал.
Я все внимательно читал в отличии от некоторых.
Вы писали буквально следующее: "Такой таблицы быть не может. Потому что не может быть одинаковых уникальных имен/наименований в базе данных."

Теперь вдруг заясняете про какую-то культуру. Зачем?
Давайте вы уже определитесь: таки может или нет? замечу, натурный эксперимент дает однозначный ответ.

Каждый факт хранится в базе в единственном экземпляре. Если как в примере автора Вася фигурирует несколько раз, это не реляционная база данных
ТС где-то утверждает, что у него реляционная база? он где-то спрашивает реляционная ли она? нет? а зачем тогда вы все это пишите? Америку открываете?
Вот потому у нас на форумах вместо четrоко ответа по экселю начинают первым делом заяснять про оракл и как это круто. Не зависимо от вопроса. Все грамотные ведь.
kostyanet
А вот зачем суммировать количество разных артикулов: ума не приложу.
И? ваши рассуждения вслух кому-то интересны?

Скорее всего автор интерпрентировал задачу так, чтобы скрыть истинную цель.
Мировая закулиса готовим мировой заговор! Это ж понятно сразу по вопросу! нас гайками-болтами не собьёшь.
kostyanet
Если как в примере автора Вася фигурирует несколько раз, это не реляционная база данных и не надо мучиться с SQL'ем. Надо просто скопипастить ее в екзель и фильтрами корежить.
Подкину в вентилятор:
Почитайте, что означают термины "реляционная" и "нормализованная". И сравните...
KSergey
Такой таблицы быть не может в базе данных. В ёкзеле, конечно, это обычное дело. Потому что это не база данных.

Ну хорошо, если у вас несколько идентичных Свет, вы как будете править поле name. Начнем, SELECT name FROM table WHERE name = 'Света', выкатилось 150 Свет, дальше что? И так каждый раз, заметьте. Света, может показаться простым именем, если оператор не забудет вовремя переключиться на RU. Иначе он наберет Cdtn, заметит, сотрет латиницу до С, допишет вета и вы эту Цвету никогда уже не найдете в базе как и ее заказ. А может оказаться не простым, а вроде такого: Маркшейдерская контора Коробчук и Голдберг. Копипастить будете, да?

Не важно, в общем. В одной таблицы базы данных Света и Света это две разные Светы, а если одинаковые, то значит база данных спроектирована без потребности в SQL.

Кстати, в примере выше была ошибка проектирования. Сделана без умысла, просто я давно уже не практиковался. Но читателям пофигу. Исправляю: в том случае природу не обмануть: каждая позиция будет связана с заказом по заказы.заказID.
KSergey
Теперь вдруг заясняете про какую-то культуру. Зачем?
Затем, что культура вырождается без поддержки культурного уровня. Сейчас вы оспариваете предикат баз данных "факт хранится в единственном числе" чтобы завтра опустить реляционную базу данных до уровня привычной вам электронной таблицы. Получится что в руках у вас SQL, а продукт - Ёкзель. Потомки идут по вашему следу и уравнивают: SQL == Ёкзель. Вот и не стало SQL'я. Был прогресс, вы его завернули вспять и получили деградацию.
KSergey
ТС где-то утверждает, что у него реляционная база?
Из вопроса по языку структуированных запросов самоочевидно вытекает наличие структуры. Но в приведенном примере никакой структуры не наблюдается. Нет структуры - нет структуированных запросов. Переводите в екзель, пользуйтесь фильтрами.
kostyanet
Такой таблицы быть не может в базе данных.
Это вы, конечно, в учебнике прочитали? Поздравляю.

Ну хорошо, если у вас несколько идентичных Свет, вы как будете править поле name. Начнем, SELECT name FROM table WHERE name = 'Света', выкатилось 150 Свет, дальше что?
Я прошу прощения, а Света - она на всем белом свете одна?!
тушите свет, концерт окончен.
Дальше я уже не читал.
Успехов!
KSergey
Не знаю сколько Свет на белом свете, а X - один. Включайте свет, может хоть что-то поймете.

Автор хотел узнать сколько всего позиций заказала Света, следовательно это копипаста одной и той же Светы. О чем автор и пишет:

Надо сделать хитрый SELECT, чтоб sum у одинаковых имен сложился и получился вывод типа:
kostyanet
Жаль, про яйца убрали.
Так вот, возвращаясь к яйцам, если бы теоретиков кормили сугубо теоретической едой - просветление в их мозгах наступало бы довольно быстро.
kostyanet
Включаем свет на местности. Света это значение переменной Х, или Y. Значение можно поменять, а переменную можно только создать или убить. У автора несколько переменных которые содержат одинаковое значение Вася. Он хочет узнать сколько Вася всего заказал. Ему приходится выбирать все переменные по значению Вася и затем группировать по этому же значению. Один Вася занимает несколько переменных, хотя коню ясно, ему вполне хватит одной. Он же один, уникальный, неповторимый Вася. Для разных Вась нужны разные переменные. Но тогда и значение у них будет разное: Вася Белый, Вася Обломов, Вася Питерский... Узнать сколько разные Васи заказали разного товара всего, можно будет с помощью предиката LIKE.
KSergey
если бы теоретиков кормили сугубо теоретической едой - просветление в их мозгах наступало бы довольно быстро.
Кто бы сомневался что профанский подход гораздо эффективнее на первых порах. Оба-на и готова база, пользуйтесь. Но через три месяца контора встала в ступор: никто не может разобраться где какой Вася среди сотен Вась. Это уже было, вы же не рискнули предложить решение что делать с кучей Свет.

На практике я регулярно с этим сталкиваюсь потому что смежники юзают екзели. Приходится акустически им помогать разобраться в их же проблемах по телефону. Он там запутался нафик, когда оно было актуально думал что все просто и понятно, а через три месяца забыл как оно было, а найти ничего не может.

Екзельные листы засасываются в базу через ODBC, но не все так просто как кажется. Приходится терять время, проверяя входящие в целях сохранения своей базы данных как таковой. Иначе засрется в кратчайшие сроки так, что сам станешь таким же варваром.
kostyanet
Скажите, а вы видимо себя специалистом считаете, да? :biggrin:
Даете советы космических масштабов и космической же глупости так легко и непринужденно, что я, право, сударь, теряюсь :biggrin:
kostyanet
Если вы хотите чтобы ваш продукт развивался и продолжал приносить прибыль, придется читать "теоретиков" и вдалбливать культуру пользования базами данных. Испоганить можно самое блестящее проектирование. Поганый - значит язычник, многобожник. Но если мы считаем что люди себе не враги, то им достаточно объяснить что поддержание базы данных требует некоторых усилий и понимания и все пойдет на лад. Обычно это делается при помощи начальства. Ему объясняете, а оно уже принуждает. Отсюда растут требования к персоналу, а значит и рост зарплаты. Но зато один оператор хорошей базы стоит десятерых дятлов ковыряющих екзельные листы.

Сделайте в екзеле базу своей фототеки: make my day как говорится. В реляционной базе это делается за час и расти она будет годами под полным контролем юзера. И чем больше накапливается структуированных данных, тем выше их ценность. А куча хлама обесценивается, поскольку затраты на разбор завалов становятся непосильными.

Хорошо структуированные данные легко экспортировать в любой формат, в том числе в XML, например. Куча хлама в которой разбирается только тот, кто ее навалил не осилит этой простой в сущности операции. Годами будет перелопачивать и все равно выйдут одни только косяки.

Если в примере Вася это ID через который условные заказы связываются с условными покупанами, то почему name, а не ID? Но зачем суммировать запросом и группировать, если в таблицу покупанов можно добавить вычисляемое поле и пусть оно суммирует сколько на покупане висит заказов в таблице заказы через поле покупанID заказа.

Например http://sql-school.info/tutor/summirovan/funktsiya_183750.htm
Mad_Dollar
Что-нибудь по существу изложите своими словами без цитат классиков.
kostyanet
а вы перечитайте начальный пост ТС и попробуйте представить, что все васи - это разные васи.
и изначально приведенные три колонки не полностью описывают структуру исходной таблицы - да-да, мы можем предположить, что там есть колонка уникального идентификатора, так вами любимого, который и используется при построении связей. что одновременно и опровергает неверное в корне ваше утверждение, сделанное на _допущении_, что этого уникального идентификатора нет.

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

парируйте, "специалист" вы наш. вы, простите, с чем работали? давно? долго? учились где-нибудь или так, обчитавшись грубера советы тут раздаете?
Mad_Dollar
Скажите, а вы видимо себя специалистом считаете, да?
Дело даже не в том.
Приведена задачка из учебника первого класса на закрепление методов, изучаемых в этом же первом классе: поезда отходят от станций А и Б одновременно навстречу друг другу, двигаются равномерно, со скоростью такой-то, найдите время когда... ну и т.д.
Соответственно ее надо быстренько решать методами первого класса, и тут же переходить к следующей.

И вдруг некто в блеском в глазах начинает заяснять, что поезда ездить должны не так, да еще надо учесть нагрев колес и то, что поезда от станций выезжают с ускорением, а еще по дороге есть 5 поворотов, где поезда сбрасывают скорость, а задачу надо решать дифурами, причем непременно с учетом теории относительности. И вообще поезда у вас спроектированы неправильно.

К чему это все - не понять. Похоже на типичного тролля.
Mad_Dollar
а вы перечитайте начальный пост ТС и попробуйте представить, что все васи - это разные васи
Такого быть не может чтобы Вася был другой Вася. По условиям которые вы предлагаете еще раз прочитать, надо выбрать все имена == Вася и суммировать все заказы одного Васи.

В порядке апологии вы могли бы догадаться сказать что Вася это ID покупана, а гайка это ID товара и тогда перед нами таблица Заказы, с которой связаны таблицы Покупаны и Товары. Но вы доказываете ровно обратное. То есть подтверждаете мои же слова. Мило.

Автор сам за себя отвечал вполне. Да и вообще, мне-то что, хотите превратить ацес в абсцесс, пожалуйста. Забивайте гвозди микроскопом. Это по-нашему.
kostyanet
что Вася это ID покупана, а гайка это ID товара и тогда перед нами таблица Заказы
А это и есть ID покупателя.
Или ID непременно должно быть чем-то вроде 123550 на ваш взгляд?
Перед нами и есть таблица заказов, причем идеально нормализованная!
KSergey
А это и есть ID покупателя.
Вы только что утверждали что это ID разных Вась.

Да, ладно, отстал...
kostyanet
Класс! Не даром пивом затарился... модерам - не сносить ни в коем рази! и-ик...

И так имеем задачку из первагу классу... асталось тока апределиться это те же Васи или другия... :ха-ха!:
и ваще, мож они и не покупаны вовся, а продаваны ... или эт-ти, как их, работягуны... :миг:

правда, нифига не понял, куда автор делся в пылу спора, ну да бог с ним! И без него весело.

Вот глядючи на весь этот сложный процесс, предлагаю перевести это в EAV модель и показать пример реализации на соответствующей БД... mongo к примеру или mumps...

Пошел за :pivo:

автору и всем участникам :respect:
kostyanet
Вы только что утверждали что это ID разных Вась.
Вы меня с кем-то спутали. Не помню такого.
kostyanet
Надо сделать хитрый SELECT, чтоб sum у одинаковых имен сложился
вот дословно что написано

но вы настолько уперты, что не хотите прочесть очевидное
Такого быть не может чтобы Вася был другой Вася. По условиям которые вы предлагаете еще раз прочитать, надо выбрать все имена == Вася и суммировать все заказы одного Васи
то есть скорректированное условие задачи вам топикстартер передал каким-то образом через космос прямо в мозг минуя форум? ах какой негодяй этот топикстартер! накол его! :rofl:
kostyanet
kostyanet, надеюсь SQL это не ваш хлеб? :biggrin:
kostyanet
Дело в том, что это таблица импортированных значений из сторонней БД, а конкретнее из SAP а. Нумерные Id понятно дело разные, поэтому "Вася" это функциональное именование, которое отвечает за связывание соответствующих таблиц из разных баз

Чего непонятного то :dnknow:, я как прочитал первый пост - сразу догадался! :umnik: