![]() |
| ||
|
|
Новости |
Поиск |
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
Какие запросы необходимы?
fedor (2004-09-13 21:00:00) [1]я не пропал, ребята!
просто думаю, как лучше.
спасибо обоим!
2sniknik © (11.09.04 12:46) [40]
и с этой точки зрения я помог, чем мог. все, остальное за ним. если не понял то что я дал, спроси или покажи как у тебя не получается. и т.д. т.е. должно быть обсуждение. если вместо него отмазки (по моему так и есть), то все разговор закончен, начинается треп. (тоже ничего себе развлечение)
...
все. мне и трепаться на эту тему надоело
ага, мне тоже, все - вопрос закрыт.
sniknik (2004-09-11 12:46:00) [2]> если у тебя есть хорошее решение, так доведи его до ума, если тебя просят о помощи.
вот. в этом у нас разница. я думаю, что основное должен делать сам спрашивающий, я только помочь, подтолкнуть в нужном направлении.
иначе только курсовые хорошо делать, положил вопрос после скопировал готовый код и забыл.
и с этой точки зрения я помог, чем мог. все, остальное за ним. если не понял то что я дал, спроси или покажи как у тебя не получается. и т.д. т.е. должно быть обсуждение. если вместо него отмазки (по моему так и есть), то все разговор закончен, начинается треп. (тоже ничего себе развлечение)
> Заодно, по поводу твоей гневной тирады из [34]:
;), лстиш себе. я не настолько эмошионален чтобы гневатся. у меня тип флегматика.
p.s. в третий раз говорю насчет кода разговор окончен. сам проверяй если хочеш.
> теперь по поводу твоего "раб. варианта" из [4]. Если на приведенной выше таблице запустить вот этот код:
...
> (я взял на себя смелость изменить там название таблицы, чтобы шло с моим примером).
> резалт сет - пустой.
естественно, ведь это для первого(сколько можно повторять) условия
> 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 в кредите. это не по оригинальному условию (первому) и если это тоже нужно я предлагал автору подумать и сделать самому, благо делается простим изменением условия.
p.p.s. все. мне и трепаться на эту тему надоело.
сергей1 (2004-09-11 09:52:00) [3]у нас слишком-уж затянулся этот спор, но если тебе так хочется доказать, что я неправ, давай разберемся.
итак, в скотобазе имеем таблицу sums следующего вида :
sum_debet sum_kredit doc_osn_no zachis_data
______________________________________________________
200 null 4 4
222 null 3 3
55 null 7 7
null 55 7 7
43 null 6 5
null 200 4 4
null 43 6 5
_______________________________________________________
запускаем этот код:
select * into #t from sums where sum_kredit in (select isnull(sum_debet,'0') from sums)
union
select * from sums where sum_debet in (select isnull(sum_kredit,'0') from sums)
select t1.sum_debet, t1.sum_kredit, t1.doc_osn_no, t1.zachis_data, t2.sum_debet as f1, t2.sum_kredit as f2, t2.doc_osn_no as f3, t2.zachis_data as f4 into #t1 from #t t1
inner join #t t2
on
t1.sum_debet=t2.sum_kredit and t1.doc_osn_no=t2.doc_osn_no and t1.zachis_data=t2.zachis_data
select sum_debet, sum_kredit, doc_osn_no, zachis_data from #t1
union
select f1,f2,f3,f4 from #t1
order by doc_osn_no
drop table #t
drop table #t1
получаем следующий резалт сет :
sum_debet sum_kredit doc_osn_no zachis_data
______________________________________________________
null 200 4 4
200 null 4 4
null 43 6 5
43 null 6 5
null 55 7 7
55 null 7 7
_______________________________________________________
т.е. имеем пары строк, с sum_debet = sum_kredit и совпадающими значениями doc_osn_no и zachis_data
(ведь именно это от нас требовалось ?)
теперь, куда именно нужно подставить 0, чтобы все перестало работать ?
давай подставим в таблицу заместо 55, т.е.
............................................
0 null 7 7
null 0 7 7
............................................
в резалт сете видим изменение :
...........................................
null 0 7 7
0 null 7 7
...........................................
вернем 55 на место.
теперь, подставим 0 заместо null в строчке с 55 (хотя это полностью не соответствует условиям задачи, у fedor'а в одной из колонок должен обязательно быть null), но чисто из спортивного интереса :
............................................
55 0 7 7
null 55 7 7
............................................
в резалт сете соответственно получается :
............................................
null 55 7 7
55 0 7 7
............................................
дальше фантазии не хватает, куда еще можно 0 подставлять что-бы получить неверный результат. Если придумаешь - пиши.
теперь по поводу твоего "раб. варианта" из [4]. Если на приведенной выше таблице запустить вот этот код:
....................................................
SELECT * FROM sums
WHERE doc_osn_no IN
(
SELECT doc_osn_no FROM
(
SELECT doc_osn_no, count(*) AS Col FROM sums
WHERE (sum_debet IS NULL) AND (sum_kredit IS NOT NULL)
GROUP BY doc_osn_no
) AS A
WHERE (Col =2)
)
......................................................
(я взял на себя смелость изменить там название таблицы, чтобы шло с моим примером).
резалт сет - пустой.
Заодно, по поводу твоей гневной тирады из [34]:
если у тебя есть хорошее решение, так доведи его до ума, если тебя просят о помощи. То, что многие здесь хотят просто получить раб. код совершенно не задействуя свою голову - это их проблемы, а не твои. Например, я если могу чем-то помочь, то помогаю не потому-то надеюсь в раю оказаться, а потому-что сам получаю ценный опыт, и лучше от этого только мне. Поэтому не вижу никаких проблем доводить дело именно до рабочего кода.
p.s. все сделано на microsoft sql server 2000, может ты просто на другом серваке делал ?
sniknik (2004-09-10 20:48:00) [4]> 100% рабочий вариант, не раз проверенный
а ноль не цифра? или думаеш нет документов с нулевой суммой?
(рекламные акции к примеру так оформляются, накладные "подарки" от фирмы, да мало ли еще)
подставь новые данные с нулем, что будет с твоей сто процентностью? ;)
говорю же (уже не раз) у тебя просто "подгонка" под показаные данные, а их может быть много и не только эти... логика должна быть универсальной и под "четкие" признаки а не по плавающим данным.
сергей1 (2004-09-10 19:22:00) [5]ну вот, fedor изчез, и даже не поблагодарил никого, а может это в самом деле я был ? эх, раздвоение личности вешь плохая
между тем, вот немного более усовершенствованный вариант
select * into #t from sums where sum_kredit in (select isnull(sum_debet,'0') from sums)
union
select * from sums where sum_debet in (select isnull(sum_kredit,'0') from sums)
select t1.sum_debet, t1.sum_kredit, t1.doc_osn_no, t1.zachis_data, t2.sum_debet as f1, t2.sum_kredit as f2, t2.doc_osn_no as f3, t2.zachis_data as f4 into #t1 from #t t1
inner join #t t2
on
t1.sum_debet=t2.sum_kredit and t1.doc_osn_no=t2.doc_osn_no and t1.zachis_data=t2.zachis_data
select sum_debet, sum_kredit, doc_osn_no, zachis_data from #t1
union
select f1,f2,f3,f4 from #t1
drop table #t
drop table #t1
100% рабочий вариант, не раз проверенный
сергей1(федор) (2004-09-09 18:43:00) [6]P.S.
это код целиком для третьей выборки, остальные два то вроде работали
сергей1(федор) (2004-09-09 18:40:00) [7]2 sniknik
ты разгадал мою подлую двуличность.
раб. код где, в [4] ?
только-что проверил, сет не пустой но неверный
2 fedor
погонял - работает, если я правильно понял задачу, все ок
sniknik (2004-09-09 17:35:00) [8]> к чему такой напряг ? как будь-то тебя премии лишат, если Федор твим вариантом не воспользуется.
...
> ты выложи раб. вариант, может и лучше моего будеть, кто спорит-то ?
мне то как раз пофигу, и я выложил - рабочий (!) - по тем условиям что здесь были даны.
если не хочет пусть не пользуется я же не настаиваю (ну особо сильно :). и пока не ответит (не будет диалога) я пальцем об палец не ударю, мне это влом. и делать за него другие запросы не буду если первого не поймет (а поймет, 2 оставшихся сделает легко).
и дальше обсуждать тоже не буду (повтор), если ктонибудь не докажет (что уже понимание) в чем я неправ, хотя бы описанием своих действий (даже не понимая), чтобы мне понять почему рабочее у меня не идет у него (хотя я и догадываюсь (если в начле топика 0 и Null у вас было одним и тем же ;))
> показывает пусто
...
> все равно пусто
это отмазки а не деятельность в решении своей же проблемы.
> [33]
где отбор по парам? и опять по сумам выборки, а если они совпадают в разных парах? даже проверять не буду, нерабочий код.
> проверил, вроде все правильно
просто подогнано под именно эти данные.
> ты выложи раб. вариант, может и лучше моего будеть, кто спорит-то ?
извини но это уже похоже на развод "лоха" на "слабо", подозреваю что в 33 fedor под ником сергей1 выступает чтобы получить готовый код.
раз я отказался делать "под ключь", так таким образом выманить, не, пусть ктонибудь другой это сделает. (спецов сдесь хватает)
> fedor ака сергей1
если всетаки наконецто решиш проверить > [4], потрудись соблюсти условия написанные в [0].
а также проверь [9] и результаты предварительного запроса из [21].
результаты донести максимально внятно...
а без этого мы просто треплемся, а это то ради чего я сюда и захожу ;о), и продолжу с удовольствием (без кода ;).
сергей1 (2004-09-09 16:41:00) [9]2 sniknik
к чему такой напряг ? как будь-то тебя премии лишат, если Федор твим вариантом не воспользуется.
>тоже говорил ([13]) нехорошо суммы в условиях. ну ладно хоть счас дошло.
Крисстально ясная формулировка идеи !
ты выложи раб. вариант, может и лучше моего будеть, кто спорит-то ?
вот мой рабочий
select * into #t from sums where sum_kredit in (select isnull(sum_debet,'0') from sums)
union
select * from sums where sum_debet in (select isnull(sum_kredit,'0') from sums)
select sum_debet as f1, sum_kredit as f2, doc_osn_no as f3, zachis_data as f4 into #t1 from #t
select * into #t2 from #t t1
inner join #t1 t2
on
t1.sum_debet=t2.f2 and t1.doc_osn_no=t2.f3 and t1.zachis_data=t2.f4
select sum_debet, sum_kredit, doc_osn_no, zachis_data from #t2
union
select f1,f2,f3,f4 from #t2
drop table #t
drop table #t1
drop table #t2
проверил, вроде все правильно
sniknik (2004-09-09 14:26:00) [10]fedor (09.09.04 13:42) [29]
> нужны именно пары!(т.е. кол-во = 2!!!)
ну а про что запрос в во втором моем посте? и дальше про то же твердил.
если хочеш продолжить, вернись к началу и как минимум ответь на то о чем я спрашивал.
а то что после стали обсуждать (с [12]) это частный случай только для приведенных данных без "добавок".
сергей1 (09.09.04 14:07) [30]
> послушай, а если получится вот такое : ...
тоже говорил ([13]) нехорошо суммы в условиях. ну ладно хоть счас дошло.
сергей1 (09.09.04 12:32) [27]
> 2 sniknik
> слушай, ну ты же опять запрос перепутал -
...
> только там isnull()
тоже поздновато
> [15] (вот если туда нули подставить к примеру то ситуация резко изменится...)
вы оба, ответы читаете? или так треплетесь?
по кругу тоже самое повторять не буду. нет значит не надо.
> по-видимому курсоры тут нужны, но вообще сразу незнаю, подумать надо
не нужны, все три варианта это вариации в условии моего первого запроса.
fedor (2004-09-09 14:25:00) [11]>то как ты определяешь, какая пара нужна ?
нужны все пары
сергей1 (2004-09-09 14:07:00) [12]послушай, а если получится вот такое :
5 200.0 NULL 3 2004-08-11
6 NULL 200.0 3 2004-08-11
8 NULL 200.0 5 2004-08-11
9 200.0 null 5 2004-08-11
то как ты определяешь, какая пара нужна ?
по-видимому курсоры тут нужны, но вообще сразу незнаю, подумать надо
fedor (2004-09-09 13:42:00) [13]нужны именно пары!(т.е. кол-во = 2!!!)
fedor (2004-09-09 13:39:00) [14]вроде как работает следующее:
select * from sums where sum_kredit in (select isnull(sum_debet,'0') from sums)
union
select * from sums where sum_debet in (select isnull(sum_kredit,'0') from sums)
ан нет!
для данного примера да, все ок!
но в общем случае нет
т.к. проверяются только суммы
но у пары doc_osn_no и zachis_data должны быть идентичны!!!
а если дано например:
id sum_debet sum_kredit doc_osn_no zachis_data
--- --------- ----------- ---------- ------------
1 NULL 128.45 1 2004-08-02
2 NULL 192.67 1 2004-08-02
3 810.0 NULL 2 2004-08-11
4 NULL 810.0 2 2004-08-11
5 200.0 NULL 3 2004-08-11
6 NULL 200.0 3 2004-08-11
7 222.4 NULL 14 2004-08-19
8 NULL 200.0 5 2004-08-11
то выводится:
id sum_debet sum_kredit doc_osn_no zachis_data
--- --------- ----------- ---------- ------------
3 810.0 NULL 2 2004-08-11
4 NULL 810.0 2 2004-08-11
5 200.0 NULL 3 2004-08-11
6 NULL 200.0 3 2004-08-11
8 NULL 200.0 5 2004-08-11
как видите, последняя строка не нужна
как быть?
сергей1 (2004-09-09 12:32:00) [15]2 sniknik
слушай, ну ты же опять запрос перепутал -
>с другойто стороны условие смотри
select * from Table1 where sum_kredit(=Null этом случае) not in (select sum_debet(= 222 единственное не попадающее
запрос, возвращающий число 222 следующий :
select * from Table1 where sum_debet not in (select sum_kredit from Table1)
только там isnull() вставить надо. кстати непонятно почему без него неработает, что-там такое хитрое в этих null
2 fedor
это 1 и 2 выборка. третья должна быть такой -
select * from Table1 where isnull(sum_kredit,'0') in (select isnull(sum_debet,'0') from Table1)
union
select * from Table1 where isnull(sum_debet,'0') in (select isnull(sum_kredit,'0') from Table1)
но не проверил насколько правильный результат, времени нет, проверь сам
fedor (2004-09-09 12:28:00) [16]насчет 1 и 3 выборки ты прав, спасибо
как же получить 2?
может как-то исключить из всей таблицы выборки 1 и 3 (тоже выход)
забыл как это делается, а может такое невозможно?
fedor (2004-09-09 12:16:00) [17]2сергей1 (09.09.04 12:11) [24]
как же получить 2 выборку?
сергей1 (2004-09-09 12:11:00) [18]так, действительно, пусто, значит делаем так :
select * from Table1 where isnull(sum_debet,'0') not in (select isnull(sum_kredit,'0') from Table1)
select * from Table1 where isnull(sum_kredit,'0') not in (select isnull(sum_debet,'0') from Table1)
проверил - работает
fedor (2004-09-09 12:07:00) [19]может, не совсем понятно объяснил задачу, объясню поподробнее:
дело в том, что проанализировав все ваши запросы, я понял, что они работают только в случае мною заданного примера.
так вот.
в реале мне нужна выборка № 2(где пары), остальное получить
несложно:
вот что дано (например):
id sum_debet sum_kredit doc_osn_no zachis_data
--- --------- ----------- ---------- ------------
1 NULL 128.45 1 2004-08-02
2 NULL 192.67 1 2004-08-02
3 810.0 NULL 2 2004-08-11
4 NULL 810.0 2 2004-08-11
5 200.0 NULL 3 2004-08-11
6 NULL 200.0 3 2004-08-11
7 222.4 NULL 14 2004-08-19
если из всей таблицы убрать эти пары, то выборка №1 - это все
кредиты, а выборка №3- дебеты соответственно.
объясню, условия отбора этих пар:
1.у пары doc_osn_no и zachis_data должны быть идентичны
2.sum_debet у одной записи пары = sum_kredit у другой записи этой пары
повторюсь: sum_debet и sum_kredit взаимоислючаемы во всей таблице
(т.е. если sum_debet не null , то sum_kredit null и наоборот)
ЗЫ
2sniknik © (09.09.04 10:04) [15]
>> я в бухгалтерии плохо понимаю
>тоже не особо старался понять.
а мне приходится, как видите
sniknik (2004-09-09 11:33:00) [20]fedor (09.09.04 11:21) [20]
> все ваши выборки дают пусто
условие-начальные данные неверны. мой запрос обязан выдавать 2 показаных записи. (уверен т.к. уже давно проверил)