SQL вложенный куда с суммами - PullRequest
0 голосов
/ 24 марта 2012

Я столкнулся с проблемой синтаксиса в SQL.То, что я пытаюсь сделать здесь, это сложить все суммы, уплаченные за каждый заказ (оплаченный каждый), а затем выбрать только те, которые больше, чем сумма оплаченного каждого для конкретного заказа # (1008).Я пытался передвигаться по множеству разных вещей здесь, и мне не повезло.

Это то, что у меня сейчас, хотя у меня было много разных вещей.Попытка использовать это просто возвращает ошибку SQL, которая не завершилась должным образом.Любая помощь, которую вы, ребята, могли бы дать, была бы очень признательна.Должен ли я использовать DISTINCT где-нибудь здесь?

SELECT ORDER#,
    TO_CHAR(SUM(PAIDEACH), '$999.99') AS "Amount > Order 1008"
FROM ORDERITEMS 
GROUP BY ORDER# 
WHERE TO_CHAR > (SUM (PAIDEACH)) 
WHERE ORDER# = 1008;

Ответы [ 3 ]

2 голосов
/ 24 марта 2012

В некоторых версиях SQL хеш-символ (#) рассматривается как начало комментария. Другие используют двойной дефис (--), а некоторые используют оба. Итак, я сначала подумал, что ваше ORDER# поле названо неправильно (хотя я не могу представить, что движок позволит вам создать поле с этим именем).

У вас есть два WHERE ключевых слова, что недопустимо. Если у вас несколько WHERE условий, вы должны связать их вместе, используя логическую логику, с ключевыми словами AND и OR.

У вас есть WHERE состояние после GROUP BY, которое должно быть отменено. Укажите WHERE условия до GROUP BY.

Одно из ваших WHERE условий не имеет смысла. TO_CHAR > (SUM(paideach)): TO_CHAR () - это функция, которая, насколько мне известно, является функцией Oracle, которая преобразует числовые значения в строки в соответствии с указанным форматом. Эквивалентом в SQL Server является CAST или CONVERT.

Я предполагаю, что вы пытаетесь написать запрос, который находит заказы с суммами, превышающими определенное значение, но это не очень понятно, потому что одно из ваших WHERE условий указывает, что номер заказа должен быть 1008, что, предположительно, вернуть только одну запись.

Запрос должен выглядеть примерно так:

SELECT order,
    SUM(paideach) AS amount
FROM orderitems
GROUP BY order
HAVING amount > 999.99;

Это позволит выбрать записи из таблицы orderitems, где сумма paideach превышает 999,99.

Я не уверен, как порядок 1008 вписывается в вещи, поэтому вам придется уточнить это.

1 голос
/ 24 марта 2012

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

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

SELECT ORDER#, SUM(PAIDEACH) AS AMOUNT
FROM ORDERITEMS
GROUP BY ORDER#;

... поиск суммы для определенного заказа:

SELECT SUM(PAIDEACH)
FROM ORDERITEMS
WHERE ORDER# = 1008;

... и их объединение,где вы застрялиСамый простой способ, и, как мы надеемся, чему-то, чему вас недавно научили, - это использовать предложение HAVING, которое идет после GROUP BY и действует как своего рода фильтр, который можно применять к агрегированным столбцам (которые вы можете 'в пункте WHERE).Если у вас есть фиксированная сумма, вы можете сделать это:

SELECT ORDER#, SUM(PAIDEACH) AS AMOUNT
FROM ORDERITEMS
GROUP BY ORDER#
HAVING SUM(PAIDEACH) > 5;

(Обратите внимание, что, поскольку @Bridge указал, что вы не можете использовать псевдоним столбца, AMOUNT, в предложении Имея, вы должны повторитьфункция агрегирования SUM).Но у вас нет фиксированного значения, вы хотите использовать фактическое итоговое значение для заказа 1008, поэтому вам нужно заменить это фиксированное значение другим запросом.Я позволю тебе сделать последний шаг ...

0 голосов
/ 24 марта 2012

Я не знаком с Oracle, и поскольку это домашнее задание, я не дам вам ответов, лишь несколько идей о том, что я считаю неправильным.

  • оператор выбора должен иметь только один оператор where - может иметь более одного условия, разумеется, только через логические операторы (все, что имеет значение true, будет включено). Например. : WHERE (column1 > column2) AND (column3 = 100)

  • Группировать по операторам следует после WHERE пунктов

  • Вы не можете ссылаться на столбцы, которые вы называли псевдонимом в предложении where того же оператора, по их псевдониму. Например, это не сработает:

    SELECT column1 as hello FROM table1 WHERE hello = 1

  • Если есть group by, столбцы, которые вы выбираете, должны быть такими же, как в этом утверждении (или их совокупности). Эта страница объясняет это лучше, чем я.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...