Переключение на Главную Страницу Страницы: 1 ОтправитьПечать
Обычная тема Декартово произведение (число прочтений - 1883 )
al_zzz
Senior Member
****
Отсутствует


1C++ ->

Сообщений: 361
Местоположение: Барнаул
Зарегистрирован: 05. Сентября 2009
Пол: Мужской
Декартово произведение
17. Сентября 2010 :: 04:52
Печать  
Задача: Есть справочник контрагентов, вложенная таблица дат, таблица сальдо контрагентов(по регистру Взаиморасчеты с поставщиками), таблица документов ПоступлениеТМЦ(док, ДатаОплаты, СуммаОплаты). Необходимо получить план оплат поставщикам.
    Из первых трёх таблиц удается получить:

   | Контрагент |   Дата    | Сальдо |
     Пост1            01.09.10    1000
     Пост1            02.09.10    1000
     ..............................................
     Пост2            01.09.10    500
     Пост2            02.09.10    500
     ..............................................
     Пост3            01.09.10    500  и т.д.

Требуется получить декартово произведение этой таблицы с таблицей Поступлений ТМЦ, чтоб получилось:
    
      | Контрагент |   Дата    | Сальдо | Док                |    Сумма    | Дата оплаты |
     Поставщик1      01.09.10    1000
     Поставщик1      02.09.10    1000  Пост.ТМЦ№1           300         02.09.10
       Поставщик1      02.09.10    1000  Пост.ТМЦ№2           500         02.09.10
     ..............................................
     Поставщик2      01.09.10    500    Пост.ТМЦ№5           800         01.09.10
     Поставщик2      02.09.10    500
     ..............................................
     Поставщик3      01.09.10    500  и т. д.
   
 
Как реализовать декартово произведение в T-SQL?
  

Каждая система проходит три стадии:&&1) Шумиха&&2) Неразбериха&&3) Поиск виновных (собственно, рабочий процесс)&&4) Наказание невиновных&&5) Награждение непричастных&& В.М. Глушков
Наверх
 
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Декартово произведение
Ответ #1 - 17. Сентября 2010 :: 05:11
Печать  
есть таблица t1 и t2
тогда декардово произведение есть

select t1.*, t2.* from t1, t2

или в новой нотации
select t1.*, t2.* from t1 cross all t2
  
Наверх
 
IP записан
 
al_zzz
Senior Member
****
Отсутствует


1C++ ->

Сообщений: 361
Местоположение: Барнаул
Зарегистрирован: 05. Сентября 2009
Пол: Мужской
Re: Декартово произведение
Ответ #2 - 17. Сентября 2010 :: 05:21
Печать  
Код
Выбрать все
ТекстЗапроса = "-- qryMaker:Отчет по просроченному поставщикам.2010.09.13.17.12.37
		|Select
		|	Выборка1.*, ПоступлениеТМЦ.*
		|From
		|(SELECT $Контрагенты.Менеджер [Менеджер $Справочник.ФизЛица]
		|   , Контрагенты.ID [Контрагент $Справочник.Контрагенты]
		|	, Dat_.Dat День
		|	, Sum(ПоставщикиОстатки.СуммаРубОстаток) СуммаСальдо
		|FROM $Справочник.Контрагенты AS Контрагенты With (NOLOCK)
		|
		|FULL OUTER JOIN Dat_ On (1=1)
		|LEFT JOIN $РегистрОстатки.Поставщики(:НачДата,
		|		RIGHT OUTER JOIN $Справочник.Контрагенты AS Контрагенты With (NOLOCK) ON $Контрагенты.ОсновнойДоговор = Договор,
		|		($Контрагенты.Менеджер = :ВыбМенеджер),
		|		Договор,
		|		СуммаРуб) AS ПоставщикиОстатки ON $Контрагенты.ОсновнойДоговор = ПоставщикиОстатки.Договор
		|WHERE ($Контрагенты.Менеджер = :ВыбМенеджер)
		|GROUP BY $Контрагенты.Менеджер
		|   , Контрагенты.Id
		|   , Контрагенты.Descr
		|   , Dat_.Dat
		|--ORDER BY Контрагенты.Id
		|--   , Dat_.Dat
		|) As Выборка1
		|  cross all ($Документ.ПоступлениеТМЦ As ПоступлениеТМЦ)
		|";	 


Получается:

Код
Выбрать все
-- qryMaker:Отчет по просроченному поставщикам.2010.09.13.17.12.37
Select
	Выборка1.*, ПоступлениеТМЦ.*
From
(SELECT Контрагенты.sp10751 [Менеджер $Справочник.ФизЛица]
   , Контрагенты.ID [Контрагент $Справочник.Контрагенты]
	, Dat_.Dat День
	, Sum(ПоставщикиОстатки.СуммаРубОстаток) СуммаСальдо
FROM sc172 AS Контрагенты With (NOLOCK)

FULL OUTER JOIN Dat_ On (1=1)
LEFT JOIN (
select
rg4314_vt.sp4306 as Договор,
sum(rg4314_vt.sp4311) as СуммаРубОстаток
from rg4314 as rg4314_vt (nolock)
RIGHT OUTER JOIN sc172 AS Контрагенты With (NOLOCK) ON Контрагенты.sp667 = rg4314_vt.sp4306
where rg4314_vt.period={d '2010-08-01'}
and ((Контрагенты.sp10751 = '    3V001'))
group by
rg4314_vt.sp4306
having
sum(rg4314_vt.sp4311) <> 0
) as ПоставщикиОстатки ON Контрагенты.sp667 = ПоставщикиОстатки.Договор
WHERE (Контрагенты.sp10751 = '    3V001')
GROUP BY Контрагенты.sp10751
   , Контрагенты.Id
   , Контрагенты.Descr
   , Dat_.Dat
--ORDER BY Контрагенты.Id
--   , Dat_.Dat
) As Выборка1
  cross all (dh1582 As ПоступлениеТМЦ)

ит = рс.ВыполнитьИнструкцию(ТекстЗапроса,ит);
{C:\1SBASES\COPYS\USR1\ОТЧЕТ ПО ПРОСРОЧЕННОМУ ПОСТАВЩИКАМ.ERT(91)}: State 42000, native 156, message [Microsoft][ODBC SQL Server Driver][SQL Server]Incorrect syntax near the keyword 'all'. 

  

Каждая система проходит три стадии:&&1) Шумиха&&2) Неразбериха&&3) Поиск виновных (собственно, рабочий процесс)&&4) Наказание невиновных&&5) Награждение непричастных&& В.М. Глушков
Наверх
 
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Декартово произведение
Ответ #3 - 17. Сентября 2010 :: 05:30
Печать  
ошибся вместо
cross all

надо
cross join

или в новой нотации
select t1.*, t2.* from t1 cross join t2
  
Наверх
 
IP записан
 
Переключение на Главную Страницу Страницы: 1
ОтправитьПечать