![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
SQL запросы
Feofan © (2003-10-22 02:32:00)
1. Каким образом можно учитывать NULL значения?
т.е. например в одной табличке есть список организаций, а во второй данные о денежных переводах.
Например выбираем данные о суммах переводах на какое-нибудь число по каждой из фирм, в итоге получаем
список фирм и суммы - но не получаем те фирмы у которых денежных переводов в этот день не было, а хотелось бы получить и их тоже, только с суммой 0.0 !
2. Таже самая таблица с денежными переводами. Нужно получить данных о переводах одной фирмы за год например в таком виде:
Январь | Февраль | Март | ....
------------------------------
сумма | сумма | сумма |
Спасибо
Sandman25 (2003-10-22 12:45:00) [1]
Наверное надо
SELECT b2,SUM(NVL(a2,0)) FROM B LEFT JOIN A ON A.a1=B.b1 and month(A.a3)=1
GROUP BY b2
Aleksei (2003-10-22 11:42:00) [2]
Johnmen
Тогда LEFT/RIGHT JOIN
Ты вообще читаешь ответы ?
Читаю не кричи :)
Есть такой
вариант
SELECT b2,SUM(NVL(a2,0)) FROM B LEFT JOIN A ON A.a1=B.b1 GROUP BY b2
q | 1.3
---------
w | 3.3
---------
e | 0.0
Но сумма считает по всем датам!
А как только:
SELECT b2,SUM(NVL(a2,0)) FROM B LEFT JOIN A ON A.a1=B.b1 GROUP BY b2 WHERE MONTH(a3)=1
то сразу получаем
q | 1.3
---------
w | 3.3
вот такая промблема!
Vlad (2003-10-22 11:17:00) [3]
SELECT b.b2,SUM(a.a2) FROM A left join B on a.a1=B.b1 GROUP BY b2 WHERE MONTH(a.a3)=1
Johnmen (2003-10-22 11:15:00) [4]
>Feofan © (22.10.03 11:10)
Тогда LEFT/RIGHT JOIN
Ты вообще читаешь ответы ?
Johnmen (2003-10-22 11:13:00) [5]
>... а хотелось бы получить и их тоже, только с суммой 0.0 !
>но надо
>
>q | 1.3
>---------
>w | 3.3
Явное противоречие...:)
Но тем не менее, для второго случая, используй [INNER] JOIN.
Feofan (2003-10-22 11:10:00) [6]
То есть наоборот
Получаем
q | 1.3
---------
w | 3.3
а надо
q | 1.3
---------
w | 3.3
---------
e | 0.0
Feofan (2003-10-22 11:07:00) [7]
Конкретезируем
таблица A:
a1 | a2 | a3
-----------------
1 | 1.3|20.01.03
2 | 2.5|21.02.03
2 | 3.3|04.01.03
таблица B:
b1 | b2
-------
1 | q
2 | w
3 | e
Делаем запрос
SELECT b2,SUM(a2) FROM A,B GROUP BY b2 WHERE MONTH(a3)=1 AND b1=a1
Получаем
q | 1.3
---------
w | 3.3
---------
e | 0.0
но надо
q | 1.3
---------
w | 3.3
Reindeer Moss Eater (2003-10-22 09:41:00) [8]
LEFT RIGHT - способ указать серверу какая таблица находится слева (справа) в открытом соединении.
Поэтому ответ зависит от конкретики потребностей автора.
Johnmen (2003-10-22 09:32:00) [9]
>Reindeer Moss Eater © (22.10.03 09:29)
OUTER (внешние) соединения бывают трех типов:
LEFT, RIGHT, FULL
Какое ты имел в виду ?
И, кстати, [OUTER]
:)
Zacho (2003-10-22 09:31:00) [10]
> Reindeer Moss Eater © (22.10.03 09:29) [7]
Тогда бы и писал полностью LEFT OUTER JOIN. А просто OUTER JOIN - абстракция какая-то.
Johnmen (2003-10-22 09:29:00) [11]
>Reindeer Moss Eater © (22.10.03 09:22)
>...надо открытое соединение
Не очень понимаю, что значит "открытое"...
А автору нужно "левое" ("правое"). Т.к. соединение со справочником. А значит не м.б. переводов, не имеющих организации.
Reindeer Moss Eater (2003-10-22 09:29:00) [12]
Уговорили. OUTER всегда хуже чем LEFT когда нужно открытое соединение и неизвестен тип сервера.
Так что ли?
Zacho (2003-10-22 09:26:00) [13]
> Reindeer Moss Eater © (22.10.03 09:22) [5]
А LEFT JOIN всегда будет внешним. Как ты представляешь себе LEFT INNER JOIN ? И чем он должен отличаться от просто INNER JOIN или RIGHT INNER JOIN ?
:-)
Reindeer Moss Eater (2003-10-22 09:22:00) [14]
Тем, что автору надо открытое соединение.
Johnmen (2003-10-22 09:19:00) [15]
>Reindeer Moss Eater © (22.10.03 08:38)
>Лучше OUTER JOIN
Чем ?
>Danilka © (22.10.03 08:41)
Это и есть джоин, просто такое своеобразное оракловое написание...:)
Danilka (2003-10-22 08:41:00) [16]
А какая СУБД?
Если ОРОКОЛ, то там нет джойна, надо делать примерно так:
SELECT
t1.field1,
t2.field1
FROM
TABLE1 t1,
TABLE2 t2
WHERE t1.field2=t2.field2(+)
Reindeer Moss Eater (2003-10-22 08:38:00) [17]
Лучше OUTER JOIN
Rad (2003-10-22 03:31:00) [18]
1. К примеру,
LEFT JOIN