Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 группировка по спецификациям  [new]
v64
Member

Откуда:
Сообщений: 16
имеем
продукт состав
Т1Д1
Т1Д2
Т3Д2
Т4Д3
Т5Д1
Т6Д1


продукт состав спецификация
Т1Д11
Т1Д21
Т3Д22
Т4Д33
Т5Д14
Т6Д14


спецификация имеет много деталей на входе и товаров на выходе, задача разбить массив на минимальное количество спецификаций. буду рад любой помощи.
19 фев 12, 17:19    [12118447]     Ответить | Цитировать Сообщить модератору
 Re: группировка по спецификациям  [new]
iljy
Member

Откуда:
Сообщений: 8711
v64,

и по какому принципу должна происходить разбивка? По составу? Самое простое:
1. Для каждого продукта получите состав в виде строки.
2. Пронумеруйте полученные строки (DENSE_RANK)
3. Profit
19 фев 12, 17:28    [12118473]     Ответить | Цитировать Сообщить модератору
 Re: группировка по спецификациям  [new]
v64
Member

Откуда:
Сообщений: 16
вторая табличка - необходимый результат. поле спецификация может иметь любой тип, главное чтобы по нему можно было сформировать сами спецификации. циферки нарисованы условно.
19 фев 12, 17:42    [12118494]     Ответить | Цитировать Сообщить модератору
 Re: группировка по спецификациям  [new]
v64
Member

Откуда:
Сообщений: 16
iljy,
к сожалению состав в виде строки - получить проблематично. (такое вот дурацкое условие)
19 фев 12, 17:56    [12118518]     Ответить | Цитировать Сообщить модератору
 Re: группировка по спецификациям  [new]
Philin
Member

Откуда: г. Иркутск
Сообщений: 162
Боюсь, не совсем понял условие, но
SELECT 'Т1' t,	'Д1' d INTO #table1 UNION
SELECT 'Т1',	'Д2'  UNION
SELECT 'Т3',	'Д2' UNION
SELECT 'Т4',	'Д3' UNION
SELECT 'Т5',	'Д1' UNION
SELECT 'Т6',	'Д1'


SELECT t.t, t.d, COUNT(t1.t)
FROM #table1 t
LEFT JOIN #table1 t1 ON t1.t > t.t
GROUP BY t.t, t.d
order by 1

drop table #table1
19 фев 12, 18:02    [12118524]     Ответить | Цитировать Сообщить модератору
 Re: группировка по спецификациям  [new]
iljy
Member

Откуда:
Сообщений: 8711
v64
iljy,
к сожалению состав в виде строки - получить проблематично. (такое вот дурацкое условие)

? Почему?
19 фев 12, 18:07    [12118539]     Ответить | Цитировать Сообщить модератору
 Re: группировка по спецификациям  [new]
v64
Member

Откуда:
Сообщений: 16
iljy,
потому что задачка для 1с предприятия (а в ней запросом проблемно слепить детальки в одну строку)
19 фев 12, 21:53    [12119188]     Ответить | Цитировать Сообщить модератору
 Re: группировка по спецификациям  [new]
v64
Member

Откуда:
Сообщений: 16
Philin, это интересно но Т5 и Т6 получаются из Д1 и должны быть в одной спецификации
19 фев 12, 21:57    [12119200]     Ответить | Цитировать Сообщить модератору
 Re: группировка по спецификациям  [new]
qwerty112
Guest
v64
Philin, это интересно но Т5 и Т6 получаются из Д1 и должны быть в одной спецификации

так ведь и Т1 - "получаются из Д1" !
почему он не в одной с Т5 и Т6 спецификации ?
19 фев 12, 22:02    [12119224]     Ответить | Цитировать Сообщить модератору
 Re: группировка по спецификациям  [new]
v64
Member

Откуда:
Сообщений: 16
iljy, можно состав заменить числовым кодом
продукт состав
Т1 1
Т1 2
Т3 2
Т4 3
Т5 1
Т6 1


можно ли добиться такого результата используя только соединения и простейшие агрегатные функции (сумма среднее мин макс)

продукт состав спецификация
Т1 1 1
Т1 2 1
Т3 2 2
Т4 3 3
Т5 1 4
Т6 1 4

заранее благодарствую за любые идеи и варианты.
19 фев 12, 22:04    [12119228]     Ответить | Цитировать Сообщить модератору
 Re: группировка по спецификациям  [new]
qwerty112
Guest
v64
продукт состав спецификация
Т1 1 1
Т1 2 1
Т3 2 2
Т4 3 3
Т5 1 4
Т6 1 4


ПАЧЕМУ ??
19 фев 12, 22:11    [12119251]     Ответить | Цитировать Сообщить модератору
 Re: группировка по спецификациям  [new]
v64
Member

Откуда:
Сообщений: 16
qwerty112,
для Т1 - нужны обе составляющие (Д1 и Д2), а те товары которые происходят из одной детали (считаем что должны быть в одной спецификации) поэтому Т5 и Т6 имеют одинаковый набор деталей в частности одну единственную Д1.

т.е. при увеличении списка решение должно выглядеть так:

продукт состав спецификация
Т1 1 1
Т1 2 1
Т3 2 2
Т4 3 3
Т5 1 4
Т6 1 4
Т7 1 1
Т7 2 1
Т8 1 5
Т8 3 5
Т8 4 5
Т9 1 5
Т9 3 5
Т9 4 5


может некорректно обозначаю проблему, прошу отнестись снисходительно ))
19 фев 12, 22:13    [12119260]     Ответить | Цитировать Сообщить модератору
 Re: группировка по спецификациям  [new]
v64
Member

Откуда:
Сообщений: 16
qwerty112,
нужно сгруппировать товары с одинаковым составом в одну спецификацию, каждый товар может состоять из одной или многих деталей.
Если из одного и того же набора деталей получаются несколько товаров одновременно - то это тоже должно находиться в одной спецификации.
19 фев 12, 22:21    [12119290]     Ответить | Цитировать Сообщить модератору
 Re: группировка по спецификациям  [new]
qwerty112
Guest
+
declare @t table (продукт varchar(2), состав int)

insert into @t

select 'Т1', 1 union all 
select 'Т1', 2 union all
select 'Т3', 2 union all
select 'Т4', 3 union all
select 'Т5', 1 union all
select 'Т6', 1 union all
select 'Т7', 1 union all
select 'Т7', 2 union all
select 'Т8', 1 union all
select 'Т8', 3 union all
select 'Т8', 4 union all
select 'Т9', 1 union all
select 'Т9', 3 union all
select 'Т9', 4

select продукт, состав,
dense_rank() over(order by (select cast(t2.состав as varchar)+'-' as 'data()' from @t t2 where t1.продукт=t2.продукт order by t2.состав for xml path(''))) as xz
from @t t1
order by 3,1

продуктсоставxz
Т112
Т122
Т324
Т435
Т511
Т611
Т712
Т722
Т813
Т833
Т843
Т913
Т933
Т943
19 фев 12, 22:30    [12119317]     Ответить | Цитировать Сообщить модератору
 Re: группировка по спецификациям  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
qwerty112,

и где же требуемый результат?

P.S. cast(t2.состав as varchar)+'-' - это некорректно (добавьте, например, двузначные значения [состав]).
Лучше, например, STR(t2.состав,10)
То есть надо дополнить каждый элемент перед конкатенацией
слева пробелом или нулём до максимальной длины элемента.
19 фев 12, 23:07    [12119428]     Ответить | Цитировать Сообщить модератору
 Re: группировка по спецификациям  [new]
v64
Member

Откуда:
Сообщений: 16
qwerty112, здорово! а без dense_rank() реально получить такой же результат? я имею ввиду используя простейшие агрегатики (sum, max, ...) дело в том что из 1с нету возможности их использовать, и синтаксические конструкции этой проги сильно упрощены.
благодарю за участие.
20 фев 12, 00:23    [12119649]     Ответить | Цитировать Сообщить модератору
 Re: группировка по спецификациям  [new]
qwerty112
Guest
v64
qwerty112, здорово! а без dense_rank() реально получить такой же результат? я имею ввиду используя простейшие агрегатики (sum, max, ...) дело в том что из 1с нету возможности их использовать, и синтаксические конструкции этой проги сильно упрощены.
благодарю за участие.


...даа, тут проблема-то не dense_rank() - его как раз просто "эмулировать" через count(distinct ..),
а в получении всего перечня состава одним значением - то что делает подзапрос с for xml path - это вас, в 1С не пугает ? там вы такую конструкцию можете "себе позволить" ?

вопщем, в самом простейшем случае, нужно знать, что в состав одного продукта входит НЕ БОЛЕЕ чем столько-то компонентов (например тут - 12119260 - это не более 3-х)
тогда можно создать запрос "один раз и на всегда" - хотя и "страшный - "что ой .."

...нуу или прийдётся узнавать макс. к-во компонентов предварительно запросом, и создавать итоговый запрос динамически, в коде 1С (я правда не знаю, возможно ли там такое ...)

select t.продукт, t.состав, -- a.xz,
(select count(distinct xz) from
	(select t1.продукт, 
	min(cast(t1.состав as varchar)+'-'+isnull(cast(t2.состав as varchar)+'-','')+isnull(cast(t3.состав as varchar)+'-','')) as xz
	from @t t1
	left join @t t2
	  on t1.продукт=t2.продукт and t1.состав<t2.состав	 
	left join @t t3
	  on t2.продукт=t3.продукт and t2.состав<t3.состав	
	group by t1.продукт) b
where b.xz<=a.xz) as res

from

(select t1.продукт, 
min(cast(t1.состав as varchar)+'-'+isnull(cast(t2.состав as varchar)+'-','')+isnull(cast(t3.состав as varchar)+'-','')) as xz
from @t t1
left join @t t2
  on t1.продукт=t2.продукт and t1.состав<t2.состав	 
left join @t t3
  on t2.продукт=t3.продукт and t2.состав<t3.состав	
group by t1.продукт) a

inner join @t t
  on a.продукт=t.продукт 

order by 1,2


продуктсоставxz
Т112
Т122
Т324
Т435
Т511
Т611
Т712
Т722
Т813
Т833
Т843
Т913
Т933
Т943
20 фев 12, 01:45    [12119781]     Ответить | Цитировать Сообщить модератору
 Re: группировка по спецификациям  [new]
qwerty112
Guest
iap
qwerty112,

и где же требуемый результат?
...

это Вы о том что не совпадает нумерация в поле "спецификация" с ТЗ ?
имхо, это не особенно важно ТС ...
20 фев 12, 01:49    [12119788]     Ответить | Цитировать Сообщить модератору
 Re: группировка по спецификациям  [new]
Naf
Member

Откуда: Москва
Сообщений: 2695
на языке запросов 1С ( да простит меня SQL)

ВЫБРАТЬ
	Т.Продукт,
	Т.Состав
ПОМЕСТИТЬ Т
ИЗ
	(ВЫБРАТЬ
		"Т1" КАК Продукт,
		"Д1" КАК Состав
	
	ОБЪЕДИНИТЬ
	
	ВЫБРАТЬ
		"Т1",
		"Д2"
	
	ОБЪЕДИНИТЬ
	
	ВЫБРАТЬ
		"Т3",
		"Д2"
	
	ОБЪЕДИНИТЬ
	
	ВЫБРАТЬ
		"Т4",
		"Д3"
	
	ОБЪЕДИНИТЬ
	
	ВЫБРАТЬ
		"Т5",
		"Д1"
	
	ОБЪЕДИНИТЬ
	
	ВЫБРАТЬ
		"Т6",
		"Д1") КАК Т
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
	Т.Продукт,
	КОЛИЧЕСТВО(РАЗЛИЧНЫЕ Т.Состав) КАК Количество
ПОМЕСТИТЬ ТКоличество
ИЗ
	Т КАК Т

СГРУППИРОВАТЬ ПО
	Т.Продукт
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
	Т.Продукт,
	Т1.Продукт КАК Продукт1,
	ТКоличество.Количество,
	ТКоличество1.Количество КАК Количество1
ПОМЕСТИТЬ Пары
ИЗ
	Т КАК Т
		ВНУТРЕННЕЕ СОЕДИНЕНИЕ Т КАК Т1
			ВНУТРЕННЕЕ СОЕДИНЕНИЕ ТКоличество КАК ТКоличество1
			ПО Т1.Продукт = ТКоличество1.Продукт
		ПО Т.Продукт <= Т1.Продукт
			И Т.Состав = Т1.Состав
		ВНУТРЕННЕЕ СОЕДИНЕНИЕ ТКоличество КАК ТКоличество
		ПО Т.Продукт = ТКоличество.Продукт

СГРУППИРОВАТЬ ПО
	Т.Продукт,
	Т1.Продукт,
	ТКоличество.Количество,
	ТКоличество1.Количество

ИМЕЮЩИЕ
	КОЛИЧЕСТВО(РАЗЛИЧНЫЕ Т.Состав) = ТКоличество1.Количество И
	КОЛИЧЕСТВО(РАЗЛИЧНЫЕ Т.Состав) = ТКоличество.Количество
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
	МИНИМУМ(Пары.Продукт) КАК Продукт,
	Пары.Продукт1 КАК Продукт1
ИЗ
	Пары КАК Пары

СГРУППИРОВАТЬ ПО
	Пары.Продукт1

УПОРЯДОЧИТЬ ПО
	Продукт,
	Продукт1
20 фев 12, 09:57    [12120223]     Ответить | Цитировать Сообщить модератору
 Re: группировка по спецификациям  [new]
v64
Member

Откуда:
Сообщений: 16
Naf, думаю что это тот вариант который мне нужен.
просто, универсально, нестандартно.
может я чего то не заметил, но думаю это будет работать.
спасибо огромное за участие!!!!
20 фев 12, 15:17    [12123378]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить