Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2002.05.30;
Скачать: CL | DM;

Вниз

SQL, кто может дать совет...   Найти похожие ветки 

 
dima2002   (2002-04-29 15:46) [0]

У меня есть 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 как так сделать? Можно без итого - это вообще загадка, не знаю как делать..


 
dima2002   (2002-04-29 17:52) [1]

Даже при такой комбинации идут повторяющиеся суммы:
select
distinct tr014.kmx,
tr004.S_DEBET,
tr004.C_DEBET,
tr006.S_DEBET,
tr006.C_DEBET,
SUM(tr016.CENA),
SUM(tr004.cena*tr004.kolt),
SUM(tr006.ctpok*tr006.kolt)
from
tr016,tr004,tr006,tr014
where
tr004.S_DEBET=tr006.S_KREDIT and tr004.C_DEBET=tr006.C_KREDIT and
tr016.SCH=tr006.S_KREDIT and tr016.SUCH=tr006.C_KREDIT and
tr016.kmx=tr006.kmx and
tr004.kmx=tr006.kmx and
tr006.kodz="03" and
tr004.kodz="03"
group by
tr014.kmx,
tr004.S_DEBET,
tr004.C_DEBET,
tr006.S_DEBET,
tr006.C_DEBET,
tr004.kolt,tr006.kolt


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

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


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

У меня не получается, нужно чтобы для каждого 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.

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


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

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


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

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


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

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


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

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

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

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


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

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


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

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


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

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

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


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

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


 
dima2002   (2002-05-07 11:58) [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 12:03) [12]

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


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

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


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

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


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

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


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

В итоге я создал такой запрос, но он выводит полную чушь, да и очень медленно работает:
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


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

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

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 ...


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

на вопрос от (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, скорее всего заработает
а потом уж ищи ошибку


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

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

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



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

>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 , а может и не быть в обоих случаях.



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

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

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



Страницы: 1 вся ветка

Текущий архив: 2002.05.30;
Скачать: CL | DM;

Наверх




Память: 0.53 MB
Время: 0.013 c
3-97153
XanderMan
2002-05-06 15:02
2002.05.30
Поиск в BLOB поле


3-97173
Oleg_er
2002-05-06 06:46
2002.05.30
Из-за чего индексы рушаться?


14-97385
SPeller
2002-04-18 08:44
2002.05.30
Проблема с Виндой


1-97318
Ila[Jr]
2002-05-19 19:12
2002.05.30
Цвета в memo


4-97448
Lamer #13
2002-03-28 13:19
2002.05.30
Kak otsledit zapis v Event Log?