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

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

SQL, кто может дать совет... [D6, dBase, FoxPro]


Страницы:   1 2

dima2002 ©   (2002-04-29 15:46:00) 

У меня есть 4 таблицы одна Главная , в ней есть поле kmx,
у трёх детайлз - таблиц есть такое же поле kmx, нужно составить запрос для получения данных для отчёта (где kmx берётся из главной таблицы, и проверяется на соответствие в трёх других,
sch и sub - из Таблицы1, Сумма1-Сумма3 - соответственно из Таблиц1-3):

kmx1 sch(1) sub(1)Сумма1() Сумма2() Сумма3() Сумма4()
sch(1) sub(2)Сумма1() Сумма2() Сумма3() Сумма4()
........ ...............
sch(n) sub(m)Сумма1() Сумма2() Сумма3() Сумма4()
Итого_kmx1: Общ сум1 Общ сум2 Общ сум3 Общ сум4

kmx2 sch(1) sub(1)Сумма1() Сумма2() Сумма3() Сумма4()
sch(1) sub(2)Сумма1() Сумма2() Сумма3() Сумма4()
........ ..............
sch(n) sub(m)Сумма1() Сумма2() Сумма3() Сумма4()
Итого_kmx2: Общ сум1 Общ сум2 Общ сум3 Общ сум4
......................................................
kmx(i) ....................
Итого_kmxi: Общ сум1 Общ сум2 Общ сум3 Общ сум4

Можно ли вообще составить SQL запрос для получения подобного набора данных? Сколько я ни мучался - ничего не выходит.
я пробовал:

select distinct maint.kmx,t1.sch,t1.sub,SUM(t1.ss),..SUM(t4.ss)
where
t1.kmx = maint.kmx and
t2.kmx = maint.kmx and
t3.kmx = maint.kmx
group by
maint.kmx,t1.sch,t1.sub

но выводятся все записи для для каждого значения kmx, мне нужно, чтобы запись
kmx1 sch(1) sub(1) Сумма1() Сумма2() Сумма3() Сумма4() - была уникальной для 3 полей kmx,sch,sub, а не только для kmx как так сделать? Можно без итого - это вообще загадка, не знаю как делать..


Гюли   (2002-05-10 09:16:00) [1]

Добрый день, dima2002!
К сожалению нет времени глубоко вникнуться в твой запрос и задачу, но, если тебе это поможет, дам совет, который мне когда-то тоже дали, и очень благодарен за него. Не пытайся свести выборку данных к одному запросу. Во-первых - это усложняет поиск где может закрасться ошибка в запросе, и во-вторых, уже по своему опыту знаю, что в большинстве случаев один большой запрос выполняется дольше, чем несколько маленьких.

С уважением, Гюли.


dima2002   (2002-05-08 09:01:00) [2]

>JaMin
Я так пробовал уже.
Вот почему-то ругается Data Provider or other service retuned E_FAIL status, очевидно не поддерживается запрос такого типа.
У меня ADO + VFP OLE DB, а что касается логики, то мне нужно
чтоб строка состояла из:

kmx tr006.s_kredit(tr004.s_debet,tr016.sch) tr006.c_kredit(tr004.c_debet,tr016.such) Prix , 0 , Rasx

или

kmx tr006.s_kredit(tr004.s_debet,tr016.sch) tr006.c_kredit(tr004.c_debet,tr016.such) 0 , Ost , Rasx

А о типах и размерности полей:

s_kredit,c_kredit,s_debet,c_debet,sch,such - все символьные С(3),

tr006.ctpok -N(12,2)
tr006.kolt -N(10,3)

tr004.cena-N(12,2)
tr004.kolt-N(12,3)

tr016.cena-N(12,2)
tr016.ostvx-N(10,3)



т.е может быть два варианта: или Ost = 0, Prix <> 0
или Prix = 0, Ost <> 0.
А вот Rasx может быть равен 0 , а может и не быть в обоих случаях.


JaMin   (2002-05-07 17:26:00) [3]

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

SELECT
TR014.KMX,
TR006.S_KREDIT,
TR006.C_KREDIT,
SUM(tr006.ctpok*tr006.kolt) as Rasxod,
0 as Prixod,
0 as Ost
FROM
tr016,TR014,tr004,tr006
WHERE
TR014.KMX = TR006.KMX

UNION

SELECT
TR014.KMX,
TR004.S_DEBET,
TR004.C_DEBET,
0 as Rasxod,
SUM(tr004.cena*tr004.kolt) as Prixod,
0 as Ost
FROM
tr016,TR014,tr004,tr006
WHERE
TR014.KMX = TR004.KMX AND
TR004.S_DEBET = tr006.S_kredit and
TR004.C_DEBET = tr006.C_kredit

UNION

SELECT
TR014.KMX,
TR016.Sch,
TR016.Such,
0 as Rasxod,
0 as Prixod,
SUM(tr016.cena*tr016.ostvx) as Ost
FROM
tr016,TR014,tr004,tr006
WHERE
TR014.KMX = TR016.KMX and
tr016.sch = tr006.S_kredit and
tr016.such = tr006.C_kredit


dimis   (2002-05-07 17:11:00) [4]

на вопрос от (07.05.02 16:13)
а типы соответствующих столбцов совпадают?
TR004.S_DEBET ->TR016.SCh,
TR004.C_DEBET ->TR016.such,
tr004.a_sum -> 0 as P,
0 as O -> TR016.CENA as O
скорее всего разные типы (int и float)
попробуй привести их все к string, скорее всего заработает
а потом уж ищи ошибку


dima2002   (2002-05-07 16:13:00) [5]

И ещё, кто может сказать, почему такой запрос не работает?

SELECT
TR014.KMX,
TR004.S_DEBET,
TR004.C_DEBET,
tr004.a_sum as P,
0 as O
FROM
tr016,TR014,TR006,tr004
WHERE
TR014.KMX in (TR004.KMX,TR006.KMX)

UNION

SELECT
TR014.KMX,
TR016.SCh,
TR016.such,
0 as P,
TR016.CENA as O
FROM
tr016,TR014,TR006,tr004
WHERE
TR014.KMX in (TR016.KMX,TR006.KMX)

ПИШЕТ SELECTs are not UNION compatible ...


dima2002   (2002-05-07 15:08:00) [6]

В итоге я создал такой запрос, но он выводит полную чушь, да и очень медленно работает:
SELECT
TR014.KMX,
TR006.S_KREDIT,
TR006.C_KREDIT,
SUM(tr006.ctpok*tr006.kolt) as Rasxod,
SUM(tr004.cena*tr004.kolt) as Prixod,
SUM(tr016.cena*tr016.ostvx) as Ost
FROM
tr016,TR014,tr004,tr006
WHERE
TR014.KMX = TR006.KMX

UNION

SELECT
TR014.KMX,
TR004.S_DEBET,
TR004.C_DEBET,
SUM(tr006.ctpok*tr006.kolt) as Rasxod,
SUM(tr004.cena*tr004.kolt) as Prixod,
SUM(tr016.cena*tr016.ostvx) as Ost
FROM
tr016,TR014,tr004,tr006
WHERE
TR014.KMX = TR004.KMX AND
TR004.S_DEBET = tr006.S_kredit and
TR004.C_DEBET = tr006.C_kredit

UNION

SELECT
TR014.KMX,
TR016.Sch,
TR016.Such,
SUM(tr006.ctpok*tr006.kolt) as Rasxod,
SUM(tr004.cena*tr004.kolt) as Prixod,
SUM(tr016.cena*tr016.ostvx) as Ost
FROM
tr016,TR014,tr004,tr006
WHERE
TR014.KMX = TR016.KMX and
tr016.sch = tr006.S_kredit and
tr016.such = tr006.C_kredit


JaMin   (2002-05-07 13:38:00) [7]

Johnmen уже ответил. 0 AS Fxx там где пустой столбец. а в расчетном sum().


fnatali   (2002-05-07 12:53:00) [8]

Попробуй какой-нибудь отчёт, где есть cross-таблицы. Например, FastReport (FreeReport).
Или DecisionCube.


dima2002   (2002-05-07 12:19:00) [9]

Ещё уточню вопрос, в UNION я объединяю соответствующие столбцы в один, а мне нужно вывести три разных столбца сумм (это - остаток, приход и расход в оборотке), а объединить три столбца каждой таблицы - (KMX,S_KREDIT,C_KREDIT)


Johnmen   (2002-05-07 12:03:00) [10]

Если в каком-либо селекте надо, чтобы поле было=0, то
0 AS Fxx


dima2002   (2002-05-07 11:58:00) [11]

Всем спасибо!!
Только, прошу простить мою маниакальную настойчивость,
а как вывести все поля F4-F6, (в сл. запросе (ниже) выводится только F6):, а так же нулевые значения?
Чтобы было вот так:
________________________________________________________________

F1(KMX) F2 F3 F4 F5 F6

________________________________________________________________
"" 10 1 0 123 23.2
1 10 1 45 0 23.1
2 10 5 0 0 78.1
3 41 1 78.12 45.2 0
________________________________________________________________


SELECT
TR014.KMX AS F1,
TR006.S_KREDIT AS F2,
TR006.C_KREDIT AS F3,
SUM(tr006.ctpok*tr006.kolt) as f4
FROM
TR014,TR006
WHERE
TR014.KMX = TR006.KMX

UNION

SELECT
TR014.KMX AS F1,
TR004.S_DEBET AS F2,
TR004.C_DEBET AS F3,
SUM(tr004.cena*tr004.kolt) as f5
FROM
TR014,TR004
WHERE
TR014.KMX = TR004.KMX

UNION

SELECT
TR014.KMX AS F1,
TR016.Sch AS F2,
TR016.Such AS F3,
SUM(tr016.cena*tr016.ostvx) as F6
FROM
TR014,TR016
WHERE
TR014.KMX = TR016.KMX


Johnmen   (2002-05-07 11:39:00) [12]

Естественно, ведь количество и типы выбираемых полей в каждом селекте должны совпадать. Желательно еще привести их к единым именам

TR014.KMX AS F1,
TR016.Sch AS F2,
TR016.Such AS F3,
SUM(TR016.Cena*TR016.ostvx) AS F4


Дистинкт здесь необязателен, т.к. юнион по умолчанию его делает.

(PS Все проблемы с формированием анализа счета, анализа счета по субконто, оборотно-сальдовой ведомости, книг/журналов покупок/продаж решаются именно с использованием UNION (по крайней мере, мною были решены когда-то))


JaMin   (2002-05-07 11:39:00) [13]

Может просто невнимательность? Если это взято из программы то в "неидущем" запросе пропущена запятая после TR016.Such в третьем блоке.
и после SUM(TR006.CTPOK*tr006.kolt) можно поставить AS S_SUM для приведения к одному (но необязательно и без этого должно работать).


dima2002   (2002-05-07 11:33:00) [14]

Да ещё как "0" поставить? если сумма будет =0
Заранее благодарен.


dima2002   (2002-05-07 11:30:00) [15]

Нет, не к одному, вот например такой запрос не идёт:

SELECT distinct
TR014.KMX,
TR006.S_KREDIT,
TR006.C_KREDIT,
SUM(TR006.CTPOK*tr006.kolt)
FROM
TR014,TR006
WHERE
TR014.KMX = TR006.KMX

UNION

SELECT distinct
TR014.KMX,
TR004.S_DEBET,
TR004.C_DEBET,
SUM(TR004.CENA*TR004.KOLT)
FROM
TR014,TR004
WHERE
TR014.KMX = TR004.KMX

UNION

SELECT distinct
TR014.KMX,
TR016.Sch,
TR016.Such
SUM(TR016.Cena*TR016.ostvx)
FROM
TR014,TR016
WHERE
TR014.KMX = TR016.KMX

а такой идёт:

SELECT distinct
TR014.KMX,
TR006.S_KREDIT,
TR006.C_KREDIT,
FROM
TR014,TR006
WHERE
TR014.KMX = TR006.KMX

UNION

SELECT distinct
TR014.KMX,
TR004.S_DEBET,
TR004.C_DEBET,
FROM
TR014,TR004
WHERE
TR014.KMX = TR004.KMX

UNION

SELECT distinct
TR014.KMX,
TR016.Sch,
TR016.Such
FROM
TR014,TR016
WHERE
TR014.KMX = TR016.KMX

Почему не пойму..


Johnmen   (2002-05-07 11:02:00) [16]

Ну и что ???!!!
Если уж надо одинаковые, приводи к одному,
используя AS.


dima2002   (2002-05-07 10:57:00) [17]

Эх, UNION не идёт - названия полей разные..


Johnmen   (2002-05-07 10:16:00) [18]

Для решение именно твоих проблем копай сюда :
1. UNION
2. группировка в отчете


dima2002   (2002-05-07 10:04:00) [19]

У меня не получается, нужно чтобы для каждого tr014.KMX, без повторения
DISTINCT tr014.КМХ выводились записи с неповторяющимися полями tr006.S_DEBET,tr006.C_DEBET, где для каждой уникальной комбинации tr014.КМХ,tr006.S_DEBET,tr006.C_DEBET выводились значения
SUM(tr016.CENA),
SUM(tr004.cena*tr004.kolt),
SUMtr006.ctpok*tr006.kolt),
где
tr014.kmx = tr004.kmx = tr006.kmx = tr016.kmx
и (
tr004.S_KREDIT = tr006.S_DEBET,
tr004.C_KREDIT = tr006.C_DEBET
или
tr016.S_KREDIT = tr006.S_DEBET,
tr016.C_KREDIT = tr006.C_DEBET
)
причём если одно из значений tr004.S_KREDIT,tr006.S_DEBET,tr004.C_KREDIT,tr006.C_DEBET равно "", то такие суммы объединяются.
, а так же если одно из значений суммы для данной строки равно 0, то выводится 0.

Вообщем неделю уже сижу - ничего не получается,
что мне делать, посоветуйте кто-нибудь


roottim   (2002-04-29 18:02:00) [20]

создавай скл без группировки
а в отчете поставь группировочный банд.. и все!


Страницы:   1 2

Наверх

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