2012-03-23 2 views
0

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

Это то, что я имею прямо сейчас, хотя у меня было много разных вещей. Попытка использовать это просто возвращает ошибку 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; 

ответ

2

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

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

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

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

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

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

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

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

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

+0

+1. Поскольку столбец называется «Столбец #», я предполагаю, что это номер заказа. Добавьте предложение 'where' для этого, и я думаю, что OP имеет свой ответ! – Bridge

+0

Я уверен, что там должен быть подзапрос, который каким-то образом привел к двум предложениям 'where'. Я думаю, что он должен найти все 'порядок #' с общим количеством 'paideach' больше, чем то, что суммарно для порядка 1008. 999.99 - это только маска формата для вывода, а не значение для сравнения. (И 'order #' ОК в качестве имени поля ir Oracle; 'order' не будет таким, как зарезервированное слово). –

0

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

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

  • Группа по отчетности должна после WHERE положений

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

    SELECT column1 as hello FROM table1 WHERE hello = 1

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

1

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

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

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, поэтому вам нужно заменить это фиксированное значение на другой запрос. Я позволю вам сделать последний шаг ...

Смежные вопросы