2014-01-15 1 views
0

У меня ограниченный опыт работы с SQL, и в настоящее время я работаю над небольшим проектом, чтобы создать представление из разных таблиц. Однако в результате я получаю декартовую продукцию.SQL looping Декартовой продукт

У меня есть 3 таблицы, с которыми я работаю, первая таблица содержит информацию о каждой ветви, вторая таблица имеет номера счетов и имена, а третья таблица имеет месячные итоговые значения. Я хочу создать представление, в котором каждая строка имеет номера учетных записей, за которыми следует столбец за каждый месяц.

Таблица ACCT - номер (первичный ключ), номер Acct, имя учетной записи и множество других столбцов, которые не важны для этого проекта.

ИТОГО Таблица - номер филиала (указывает на таблицу ОТКРЫТИЯ), месяц (формат ММ-ГГГГ), номер Acct (указывает на первичный ключ таблицы ACCT) и столбец ежемесячных итогов.

Acct - Acct Имя - Ян Сумма - февраль Сумма - март сумма ..... декабрь Сумма

Я хотел сделать что-то вроде для-каждого цикла (для каждого учетного, показываю месячные суммы), но поскольку SQL не имеет этого параметра, я сделал следующее. Я даже не присоединяюсь к таблице филиалов в этот момент и только с выбранными двумя месяцами я получаю декартовой продукт.

select a.scode glacct, a.sdesc glacctdescp, 
t1.smtd Amt01, t2.smtd Amt02 
from acct a 
inner join total t1 on a.hmy = t1.hacct and t1.umonth = '2013-01-01' and t1.ibook = '1' 
left outer join total t2 on a.hmy = t2.hacct and t2.umonth = '2013-02-01' and t2.ibook = '1' 

Я был бы признателен, если вы можете сказать мне, как исправить внутреннее соединение заявления, так как именно там у меня есть проблемы. Индивидуально это дает мне информацию, которую я ищу, но входы не работают.

Благодаря

+0

Ваш запрос выглядит нормально. Почему вы думаете, что получаете декартовую продукцию? –

+0

waht's ваши dbms? –

+0

Индивидуально я получаю около 9000 записей за каждый месяц, но в этом объединенном запросе мои результаты находятся в диапазоне 430 000. – deepiceman

ответ

0

в MySQL, если вы хотите, всего за месяц, это должно выглядеть так, что

select a.scode glacct, a.sdesc glacctdescp 
sum(case when month(t.umonth) = 1 then t.smtd else 0 end) as JanuaryAmount, 
sum(case when month(t.umonth) = 2 then t.smtd else 0 end)as FebruaryAmount, 
sum(case when month(t.umonth) = 3 then t.smtd else 0 end) as MarchAmount 
--etc. 
from acct a 
inner join total t on a.hmy = t.hacct 
where year(t.umonth)=2013 
and t.ibook = 1 
group by a.scode, a.sdesc 
+0

работал как шарм! Спасибо @ Raphael – deepiceman

0

Ответ от Рафаэля, вероятно, довольно близко, большая причина для декартова произведения является то, что вам не группируют и не суммируют подробные строки, которые, на мой взгляд, являются вашей целью. Другим способом приблизиться к ней было бы просто группировать по году, месяцу и учетной записи, чтобы вы получали строку результатов для каждой учетной записи каждый месяц каждого года в наборе данных.

select a.scode glacct, a.sdesc glacctdescp, 
sum(t1.smtd) 
from acct a 
inner join total t1 on a.hmy = t1.hacct and t1.umonth = '2013-01-01' and t1.ibook = '1' 
left outer join total t2 on a.hmy = t2.hacct and t2.umonth = '2013-02-01' and t2.ibook = '1' 
Group by Year(t1.umonth), Month(t1.umonth),glacct,a.scode