Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 2002.05.30;
Скачать: [xml.tar.bz2];

Вниз

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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.5 MB
Время: 0.009 c
14-97384
Morfey
2002-04-20 19:12
2002.05.30
декоммпилятор


4-97451
Влад_К
2002-03-28 08:44
2002.05.30
Как установать курсор в _классе_ окна


1-97311
ETeRNaL
2002-05-19 07:59
2002.05.30
Coolbar


1-97230
Glonia Zbanov
2002-05-20 15:24
2002.05.30
Taskbar


3-97131
Maloy
2002-05-06 12:00
2002.05.30
Проблема выполнения сложного запроса в IBase





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский