![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
SQL- запрос ? [D7, MySQL]
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)
и его "вариации"