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

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

SQL- запрос ? [D7, MySQL]


Страницы:   1 2 3

fedor ©   (2004-09-08 10:53:00) 

Дано следующее:

sum_debet   sum_kredit  doc_osn_no  zachis_data  
---------  -----------  ----------  ------------
NULL        128.45         1        2004-08-02
NULL        192.67         1        2004-08-02
810.0       NULL           2        2004-08-11
NULL        810.0          2        2004-08-11
200.0       NULL           3        2004-08-11
NULL        200.0          3        2004-08-11
222.4       NULL           14       2004-08-19


Нужно получить 3 запроса:
1)все кредиты, не имеющие "пары" с дебетом

sum_debet   sum_kredit  doc_osn_no  zachis_data  
---------  -----------  ----------  ------------
NULL        128.45         1        2004-08-02
NULL        192.67         2        2004-08-02

2)все дебеты, не имеющие "пары" с кредитом

sum_debet   sum_kredit  doc_osn_no  zachis_data  
---------  -----------  ----------  ------------
222.4       NULL           14       2004-08-19

3)все "пары" кредиты-дебеты (doc_osn_no и zachis_data должны быть при этом равны)

sum_debet   sum_kredit  doc_osn_no  zachis_data  
---------  -----------  ----------  ------------
810.0       NULL           2        2004-08-11
NULL        810.0          2        2004-08-11
200.0       NULL           3        2004-08-11
NULL        200.0          3        2004-08-11

Какие запросы необходимы?


sniknik   (2004-09-09 11:31:00) [21]

> итого в итоговом сете - 222, что и требовалось доказать
ну во первых не пара, а во вторых не попадет
с другойто стороны условие смотри
select * from Table1 where sum_kredit(=Null этом случае) not in (select sum_debet(= 222 единственное не попадающее значение на что можно делать проверку) from Table1)
как оно сработает если sum_kredit Null? он с любой стороны не сработает, а получается (если подставить) "если Null not in (222)" (да оно что non in что in false даст).
а вообще проверь.
только предварительно запрос
select * from Table1 where (sum_debet is Null) or (sum_kredit is Null)
и посмотри все записи? по идее должно все выдавать т.к. в исходной таблице чтото да Null.


fedor   (2004-09-09 11:21:00) [22]

все ваши выборки дают пусто


сергей1   (2004-09-09 10:49:00) [23]

не эксплорер, а полное гавно !
или с сайтом что-то не то...


сергей1   (2004-09-09 10:38:00) [24]

подожди-ка,

>проверяем, первый столбец на невхождение во второй столбец
запрос-то тогда другой :
select * from Table1 where sum_debet not in (select sum_kredit from Table1) and sum_debet is not null

is not null я поставил, т.к. null не будет равен ни одному значению в другом столбце по определению, а значит попадет в выборку

далее как у тебя :

1 - null - не попадает
2 - null - аналогично
3 - 810 - входит, значит исключаем
4 - null
5 - 200 - входит, значит исключаем
6 - null
7 - 222 - не входит, попадает в выборку

итого в итоговом сете - 222, что и требовалось доказать


сергей1   (2004-09-09 10:38:00) [25]

подожди-ка,

>проверяем, первый столбец на невхождение во второй столбец
запрос-то тогда другой :
select * from Table1 where sum_debet not in (select sum_kredit from Table1) and sum_debet is not null

is not null я поставил, т.к. null не будет равен ни одному значению в другом столбце по определению, а значит попадет в выборку

далее как у тебя :

1 - null - не попадает
2 - null - аналогично
3 - 810 - входит, значит исключаем
4 - null
5 - 200 - входит, значит исключаем
6 - null
7 - 222 - не входит, попадает в выборку

итого в итоговом сете - 222, что и требовалось доказать


сергей1   (2004-09-09 10:37:00) [26]

подожди-ка,

>проверяем, первый столбец на невхождение во второй столбец
запрос-то тогда другой :
select * from Table1 where sum_debet not in (select sum_kredit from Table1) and sum_debet is not null

is not null я поставил, т.к. null не будет равен ни одному значению в другом столбце по определению, а значит попадет в выборку

далее как у тебя :

1 - null - не попадает
2 - null - аналогично
3 - 810 - входит, значит исключаем
4 - null
5 - 200 - входит, значит исключаем
6 - null
7 - 222 - не входит, попадает в выборку

итого в итоговом сете - 222, что и требовалось доказать


sniknik   (2004-09-09 10:04:00) [27]

> я в бухгалтерии плохо понимаю
тоже не особо старался понять.

> а что тогда такое пара ?
ну как понял, по doc_osn_no у него парное все (в начальных данных смотри) т.е. там есть 3 пары значения (1,2,3) и одна непарная запись (14).

> но вроде мой запрос выводит то, что в топике указано.
да вроде нет, давай первый разберем
должен вывести
sum_debet   sum_kredit  doc_osn_no  zachis_data  
---------  -----------  ----------  ------------
NULL        128.45         1        2004-08-02
NULL        192.67         1        2004-08-02
так
у тебя запрос
select * from Table1 where sum_kredit not in (select sum_debet from Table1) and sum_kredit is not null
можно упростить (ну sum_kredit если участвует в выборке то он уже не null)
т.е. то же самое
select * from Table1 where sum_kredit not in (select sum_debet from Table1)
в оставшемся условии проверяется, что sum_kredit не входит в в выборку из sum_debet так? проверяем, первый столбец на невхождение во второй столбец

  sum_debet   sum_kredit
  ---------  -----------
1 NULL        128.45 - входит и плюс к этому NULL не участвует в сравнениях/операциях - исключается
2 NULL        192.67 - NULL - исключается
3 810.0       NULL   - входит (= с кредитом в 3 строке)
4 NULL        810.0  - NULL - исключается
5 200.0       NULL   - входит (= с кредитом в 6 строке)
6 NULL        200.0  - NULL - исключается
7 222.4       NULL   - вроде бы и не входит, но теперь с другой стороны NULL, а NULL in (NULL, ...) тоже не работает (вообще NULL<>NULL)

т.е. в результате пустая выборка...
или у тебя там не NULL или ты меня обманываеш, что запрос чтото возвращает, тем более пару... (вот если туда нули подставить к примеру то ситуация резко изменится...)


сергей1   (2004-09-09 09:26:00) [28]

я в бухгалтерии плохо понимаю, но вроде мой запрос выводит то, что в топике указано. а что тогда такое пара ?


sniknik   (2004-09-09 08:50:00) [29]

сергей1   (08.09.04 18:40) [12]
а про пары забыл. там же именно пары "главное". а у тебя они "перекрестятся".
или я все неправильно понимаю... ;о))

и потом нехорошо в условии закладыватся на сумму, случайную величину в общемто, может случайно и совпасть.


сергей1   (2004-09-08 18:40:00) [30]

если правильно понимаю, нужны все строки sum_debet, в которых значения не совпадают ни с одним из значений в столбце sum_kredit ? и наоборот ?

1.
select * from Table1 where sum_kredit not in (select sum_debet from Table1) and sum_kredit is not null

2.
select * from Table1 where sum_debet not in (select sum_kredit from Table1) and sum_debet is not null

3.
select * from Table1 where sum_kredit in (select sum_debet from Table1) and sum_kredit is not null
union
select * from Table1 where sum_debet in (select sum_kredit from Table1) and sum_debet is not null


sniknik   (2004-09-08 12:48:00) [31]

запрос в [9] для первого варианта,
> Нужно получить 3 запроса:
> 1)все кредиты, не имеющие "пары" с дебетом

> sum_debet   sum_kredit  doc_osn_no  zachis_data  
> ---------  -----------  ----------  ------------
> NULL        128.45         1        2004-08-02
> NULL        192.67         1        2004-08-02


вот это он и выдаст, если есть такое (и если NULL есть NULL)

все остальное сам


fedor   (2004-09-08 12:11:00) [32]

> все кредиты, не имеющие "пары" с дебетом
т.е. в дебете ничего а кредите цыфра. так?
не так. если в дебете ничего, то в кредите цифра в любом случае
и наоборот.

вот пара:
sum_debet   sum_kredit  doc_osn_no  zachis_data  
---------  -----------  ----------  ------------
810.0       NULL           2        2004-08-11
NULL        810.0          2        2004-08-11
т.е. в дебет 1 строки = кредиту 2-й строки
doc_osn_no и  zachis_data - одинаковые


sniknik   (2004-09-08 11:58:00) [33]

> 2sniknik ©   (08.09.04 11:32) [4]
> показывает пусто
замечательно. раз чтото показывает значит написал правильно ;о)), хотя бы синтаксис, а логика должна быть правильной.  
проверь вложенные по отдельности

SELECT doc_osn_no, count(*)  AS Col FROM Deb
WHERE (sum_debet IS NULL) AND (sum_kredit IS NOT NULL)
GROUP BY doc_osn_no

так есть чтонибудь? должен быть список из doc_osn_no и количества их повторений (пары), для заданного условия
> все кредиты, не имеющие "пары" с дебетом
т.е. в дебете ничего а кредите цыфра. так?

SELECT doc_osn_no FROM
(
SELECT doc_osn_no, count(*)  AS Col FROM Deb
WHERE (sum_debet IS NULL) AND (sum_kredit IS NOT NULL)
GROUP BY doc_osn_no
) AS A
WHERE (Col = 2)


так? здесь отсекаем эти самые пары. выдает чтонибудь?

а в верхнем показываем то что нашли (условие по doc_osn_no), все логично, если нет ничего то значит данных нет или в условии чтото напутано


fedor   (2004-09-08 11:47:00) [34]

все равно пусто


fedor   (2004-09-08 11:45:00) [35]

sniknik ©   (08.09.04 11:40) [5]

чччерт..., все отменяется! я прочитал в заголовке MySQL как MSSQL, т.е. не отменяется но с большой вероятностью приведенный запрос будет для него "корявым".

черт должен сказать я, это я спутал - у меня  MSSQL
извини уж


fedor   (2004-09-08 11:41:00) [36]

2sniknik ©   (08.09.04 11:32) [4]
показывает пусто


sniknik   (2004-09-08 11:40:00) [37]

чччерт..., все отменяется! я прочитал в заголовке MySQL как MSSQL, т.е. не отменяется но с большой вероятностью приведенный запрос будет для него "корявым".


sniknik   (2004-09-08 11:32:00) [38]

> вообще-то что это дает?
вариант (возможно не сильно оптимизировано но..) получаем (должны) то что в первом условии описано (остальное думаю по аналогии можно)

SELECT * FROM Deb
WHERE doc_osn_no IN
(
SELECT doc_osn_no FROM
(
SELECT doc_osn_no, count(*)  AS Col FROM Deb
WHERE (sum_debet IS NULL) AND (sum_kredit IS NOT NULL)
GROUP BY doc_osn_no
) AS A
WHERE (Col =2)
)


fedor   (2004-09-08 11:21:00) [39]

2sniknik ©   (08.09.04 11:13) [2]

(sum_debet IS NULL) AND (sum_kredit IS NOT NULL)

вообще-то что это дает?
ведь можно просто (sum_debet IS NULL), остальная часть подразумевается. И наоборот.Либо дебет, либо кредит.


sniknik   (2004-09-08 11:13:00) [40]

> вообще возможно ли это сделать с помощью запросов?
естественно

нужно условие
(sum_debet IS NULL) AND (sum_kredit IS NOT NULL)
и его "вариации"


Страницы:   1 2 3

Наверх

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