Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

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


Наверх

Титульная страница Поиск, карта сайта Написать письмо