![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Помогите составить SQL-запрос [D7, Access]
Антоныч © (2005-02-24 16:09:00)Уважаемые мастера! Возникла проблема, уже бьюсь над ней 2-й день. (Сразу скажу, что в SQL я шибко не силен). Пусть для примера имеется таблица
T1 - имя таблицы
F1 ! F2 ! F3 - поля
Pr1! A ! 27
Pr1! A ! 12
Pr1! B ! 3
Pr2! B ! 2
Pr2! A ! 10
Pr2! B ! 7
Необходимо составить SQL-запрос, в котором первое поле - это название F1, второе - это сумма всех значений F1, где поле F2 (некоторый признак) равно значению 'А', и третье - сумма всех значений F1, где поле F2 равно 'В'. Чтоб было яснее, приведу пример для суммы со значением 'A':
SELECT F1,SUM(F3)
FROM T1
WHERE F2="A"
GROUP BY F1
Получается таблица вида
F1 ! SummaA
Pr1! 39
Pr2! 10
Можно ли сделать так, чтоб в результате запроса в одной таблице было и поле SummaA, и поле SummaB?
Антоныч (2005-03-01 16:58:00) [1]:) А ларчик просто открывался!
Спасибо в очередной раз!
Johnmen (2005-03-01 16:42:00) [2]
SELECT T1.F1,
(SELECT SUM(T2.F3) FROM T1 T2 WHERE (T2.F1=T1.F1) AND (T2.F2='A')) AS SUMA,
(SELECT SUM(T3.F3) FROM T1 T3 WHERE (T3.F1=T1.F1) AND (T3.F2='B')) AS SUMB
FROM T1
GROUP BY T1.F1
HAVING (SELECT SUM(T2.F3) FROM T1 T2 WHERE (T2.F1=T1.F1) AND (T2.F2='A'))<15
Антоныч (2005-03-01 16:10:00) [3]Итак, это снова я :)
Понадобилось изменить предыдущий запрос таким образом, чтоб строка выводилась только в том случае, если суммы по А или по В проходят некоторое ограничение. Например, изменил:
SELECT T1.F1,
(SELECT SUM(T2.F3) FROM T1 T2 WHERE (T2.F1=T1.F1) AND (T2.F2='A') HAVING SUM(T2.F3)<15) AS SUMA,
(SELECT SUM(T3.F3) FROM T1 T3 WHERE (T3.F1=T1.F1) AND (T3.F2='B')) AS SUMB
FROM T1
GROUP BY T1.F1
Получается результат
F1 ! SummaA! SummaВ
Pr1! !
Pr2! 10 ! 9
Pr1 в данном случае мне не нужен. Как от него избавиться?
Антоныч (2005-03-01 12:23:00) [4]Johnmen:
согласен, с Table это я ступил :) Но это ведь твой написанный код был :)
Кстати, заработало:
SELECT T1.F1,
(SELECT SUM(T2.F3) FROM T1 T2 WHERE (T2.F1=T1.F1) AND (T2.F2='A')) AS SUMA,
(SELECT SUM(T3.F3) FROM T1 T3 WHERE (T3.F1=T1.F1) AND (T3.F2='B')) AS SUMB
FROM T1
GROUP BY T1.F1
ВСЕ СПАСИБО, НО Я НЕ ПРОЩАЮСЬ :)))
Johnmen (2005-03-01 12:10:00) [5]>Антоныч (01.03.05 12:03) [23]
А у тебя есть таблицы с именами 'Table', 'T1', 'T2', 'T3' ?
:)
Антоныч (2005-03-01 12:03:00) [6]
SELECT T1.F1,
(SELECT SUM(T2.F3) FROM Table T2 WHERE (T2.F1=T1.F1) AND (T2.F2='A')) AS SUMA,
(SELECT SUM(T3.F3) FROM Table T3 WHERE (T3.F1=T1.F1) AND (T3.F2='B')) AS SUMB
FROM Table T1
GROUP BY T1.F1
Ошибка синтаксиса в выражении запроса
(SELECT SUM(T2.F3) FROM Table T2 WHERE (T2.F1=T1.F1) AND (T2.F2='A'))
То же самое, но по-другому:
SELECT T1.F1,a.SUMA,b.SUMB
FROM T1,
(SELECT SUM(T2.F3) as SUMA FROM T2 WHERE (T2.F1=T1.F1) AND (T2.F2="A")) a,
(SELECT SUM(T3.F3) as SUMB FROM T3 WHERE (T3.F1=T1.F1) AND (T3.F2="B")) b
GROUP BY T1.F1
Не найдена таблица или запрос T2
Anatoly Podgoretsky (2005-03-01 11:40:00) [7]Тебе говорят - код давай.
Антоныч (2005-03-01 11:38:00) [8]Так не один же раз делал... И не бездумно copy-paste..
Johnmen (2005-03-01 11:32:00) [9]>[12] выдает ошибку синтаксиса (см. [13])
Ну я же не видел, как ты copy-paste сделал :)))
Может чего и накосячил...
Антоныч (2005-03-01 11:30:00) [10][12] выдает ошибку синтаксиса (см. [13])
Johnmen (2005-03-01 11:22:00) [11][12]
sniknik (2005-03-01 11:22:00) [12]не, "загвоздка" в том что неявно для обьеденения используется оператор INNER JOIN а тебе нужен(для описаного "эффекта") LEFT/RIGHT JOIN
надо переписать запрос с учетом явного обьеденения (и нужной команды).
Антоныч (2005-03-01 11:10:00) [13]Продолжу тему, обнаружил недавно проблему:
Значение поля F1 будет включено в результат запроса, только если у него есть значения полей F2 и "A" и "B" (а хотелось бы, чтоб или "A" или "B"). Для ясности приведу пример:
F1 ! F2 ! F3
Pr1! A ! 27
Pr1! A ! 12
Pr1! А ! 3
Pr2! B ! 2
Pr2! A ! 10
Pr2! B ! 7
Результатом запроса [14] будет:
F1 ! SummaA! SummaВ
Pr2! 10 ! 9
Т.е. Pr1 не включилось, т.к. для этого значения нет "B" в F2. Хотелось бы, чтоб результат запроса имел вид:
F1 ! SummaA! SummaВ
Pr1! 42 ! 0 (или пустая ячейка, значения не имеет)
Pr2! 10 ! 9
Кто-нибудь может помочь?
Мне кажется, что здесь загвоздка в принципе работы агрегирующей функции SUM, а также GROUP BY, но вот где - не могу уловить :).
Заранее благодарен.
Антоныч (2005-02-24 18:26:00) [14]Ольга, большое спасибо! Домой пойду с работы в хорошем настроении :).
Ольга (2005-02-24 18:08:00) [15]Забыла в GROUP BY включить несуммируемое поле b.SUM2
SELECT a.F1,SUM(F3), b.SUM2
FROM T1 a,
(SELECT F1,SUM(F3) as SUM2
FROM T1
WHERE F2="A"
GROUP BY F1) b
WHERE F2="B" AND a.F1=b.F1
GROUP BY a.F1, b.SUM2
Антоныч (2005-02-24 18:02:00) [16]Ольга:
Выдает ошибку "Попытка выполнить запрос, который не включает указанное выражение SUM2 как часть статистической функции или группы".
Johnmen:
Выдает ошибку синтаксиса в выражении запроса
(SELECT SUM(T2.F3) FROM Table T2 WHERE (T2.F1=T1.F1) AND (T2.F2='A'))
Но все-равно всем спасибо :)
Johnmen (2005-02-24 17:49:00) [17]
SELECT T1.F1,
(SELECT SUM(T2.F3) FROM Table T2 WHERE (T2.F1=T1.F1) AND (T2.F2='A')) AS SUMA,
(SELECT SUM(T3.F3) FROM Table T3 WHERE (T3.F1=T1.F1) AND (T3.F2='B')) AS SUMB
FROM Table T1
GROUP BY T1.F1
Desdechado (2005-02-24 17:45:00) [18]через UNION ALL
Val (2005-02-24 17:36:00) [19]>[9] Ольга (24.02.05 17:22)
согласен, ошибка.
Ольга (2005-02-24 17:22:00) [20][7]
Так не катит.
У вас summaA и summaB будут одинаковые и неправильные.
Возьмем из примера:
для Pr1 summaA=42 summaB=42
а правильно:
для Pr1 summaA=39 summaB=3