Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 2005.03.27;
Скачать: [xml.tar.bz2];

Вниз

Помогите составить 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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.51 MB
Время: 0.054 c
6-1106817075
Наф
2005-01-27 12:11
2005.03.27
TServerSocket


3-1109412494
Walker
2005-02-26 13:08
2005.03.27
Нужен компонент а-ля Access "поле со списком"


1-1110482942
kirilllius
2005-03-10 22:29
2005.03.27
Update Delphi 7


3-1109840819
juice
2005-03-03 12:06
2005.03.27
DataSource


1-1110479308
100a
2005-03-10 21:28
2005.03.27
Количество четных бит?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский