Форум: "Базы";
Текущий архив: 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