Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.03.27;
Скачать: CL | DM;

Вниз

Помогите составить SQL-запрос   Найти похожие ветки 

 
Антоныч   (2005-02-24 16:09) [0]

Уважаемые мастера! Возникла проблема, уже бьюсь над ней 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?


 
Anatoly Podgoretsky ©   (2005-02-24 16:12) [1]

Читал, читал, ни фига не понятно, но на всякий случай строковые поля нельзя суммировать.


 
Sergey13 ©   (2005-02-24 16:28) [2]

SELECT F1,F2,SUM(F3)
FROM T1
GROUP BY F1,F2


 
Антоныч   (2005-02-24 16:45) [3]

Sergey13:
Тогда получится:
F1 ! F2! Summa
Pr1! А ! 39
Pr1! B ! 3
Pr2! А ! 10
Pr2! B ! 9

А надо, чтоб
F1 ! SummaA! SummaВ
Pr1! 39    ! 3
Pr2! 10    ! 9


 
Sergey13 ©   (2005-02-24 16:47) [4]

Это уже вроде как перекрестный запрос. Вроде Аксес так может. Как - не знаю.


 
Антоныч   (2005-02-24 16:49) [5]

Sergey13:
Тогда получится:
F1 ! F2! Summa
Pr1! А ! 39
Pr1! B ! 3
Pr2! А ! 10
Pr2! B ! 9

А надо, чтоб
F1 ! SummaA! SummaВ
Pr1! 39    ! 3
Pr2! 10    ! 9


 
Антоныч   (2005-02-24 16:50) [6]

Блин, извиняюсь, просто инет глючит страшно :)


 
Val ©   (2005-02-24 17:06) [7]

select a.f1, sum(a.f3) as summaA, sum(b.f3) as summaB
from l_tbl a, l_tbl b
where a.id = b.id
  and (a.f2 = "A"  or b.f2 = "B")
group by a.f1


 
Ольга   (2005-02-24 17:10) [8]

Не знаю, поддерживаются ли в Access вложенные запросы.
Если да , то так:

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


 
Ольга   (2005-02-24 17:22) [9]

[7]
Так не катит.
У вас summaA и summaB будут одинаковые и неправильные.
Возьмем из примера:
   для Pr1 summaA=42 summaB=42
а правильно:
   для Pr1 summaA=39 summaB=3


 
Val ©   (2005-02-24 17:36) [10]

>[9] Ольга   (24.02.05 17:22)
согласен, ошибка.


 
Desdechado ©   (2005-02-24 17:45) [11]

через UNION ALL


 
Johnmen ©   (2005-02-24 17:49) [12]

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


 
Антоныч   (2005-02-24 18:02) [13]

Ольга:
Выдает ошибку "Попытка выполнить запрос, который не включает указанное выражение SUM2 как часть статистической функции или группы".

Johnmen:
Выдает ошибку синтаксиса в выражении запроса
(SELECT SUM(T2.F3) FROM Table T2 WHERE (T2.F1=T1.F1) AND (T2.F2="A"))

Но все-равно всем спасибо :)


 
Ольга   (2005-02-24 18:08) [14]

Забыла в 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:26) [15]

Ольга, большое спасибо! Домой пойду с работы в хорошем настроении :).


 
Антоныч   (2005-03-01 11:10) [16]

Продолжу тему, обнаружил недавно проблему:
Значение поля 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, но вот где - не могу уловить :).
Заранее благодарен.


 
sniknik ©   (2005-03-01 11:22) [17]

не, "загвоздка" в том что неявно для обьеденения используется оператор INNER JOIN а тебе нужен(для описаного "эффекта") LEFT/RIGHT JOIN

надо переписать запрос с учетом явного обьеденения (и нужной команды).


 
Johnmen ©   (2005-03-01 11:22) [18]

[12]


 
Антоныч   (2005-03-01 11:30) [19]

[12] выдает ошибку синтаксиса (см. [13])


 
Johnmen ©   (2005-03-01 11:32) [20]

>[12] выдает ошибку синтаксиса (см. [13])

Ну я же не видел, как ты copy-paste сделал :)))
Может чего и накосячил...


 
Антоныч   (2005-03-01 11:38) [21]

Так не один же раз делал... И не бездумно copy-paste..


 
Anatoly Podgoretsky ©   (2005-03-01 11:40) [22]

Тебе говорят - код давай.


 
Антоныч   (2005-03-01 12:03) [23]

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


 
Johnmen ©   (2005-03-01 12:10) [24]

>Антоныч   (01.03.05 12:03) [23]

А у тебя есть таблицы с именами "Table", "T1", "T2", "T3" ?
:)


 
Антоныч   (2005-03-01 12:23) [25]

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

ВСЕ СПАСИБО, НО Я НЕ ПРОЩАЮСЬ :)))


 
Антоныч   (2005-03-01 16:10) [26]

Итак, это снова я :)
Понадобилось изменить предыдущий запрос таким образом, чтоб строка выводилась только в том случае, если суммы по А или по В проходят некоторое ограничение. Например, изменил:
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 в данном случае мне не нужен. Как от него избавиться?


 
Johnmen ©   (2005-03-01 16:42) [27]

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:58) [28]

:) А ларчик просто открывался!
Спасибо в очередной раз!



Страницы: 1 вся ветка

Текущий архив: 2005.03.27;
Скачать: CL | DM;

Наверх




Память: 0.53 MB
Время: 0.026 c
9-1104846353
Trof
2005-01-04 16:45
2005.03.27
glscene


1-1110980092
WELLiON
2005-03-16 16:34
2005.03.27
Ошибка в реализации очереди?


1-1110752112
Гоу ту
2005-03-14 01:15
2005.03.27
Можно ли избавиться от goto в этом коде ?


14-1108997302
Delirium
2005-02-21 17:48
2005.03.27
"Вышел в свет" или балуемся с web-камерй


3-1109532138
Arazel
2005-02-27 22:22
2005.03.27
ComboBox в ячейке DBGRID как этоделается