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

Откуда:
Сообщений: 100
здравствуйте, вобщем есть таблица Т1 (КодДетали,Цех,Номер). Цех - номер цеха, КодДетали - уникальный номер детали, Номер - номер цеха по очередности в которые заходила деталь.

КодДетали|Цех|Номер
-----------------------
111111111|123|0001
111111111|124|0002
111111111|125|0003
222222222|127|0001
222222222|123|0002

Количество деталей попавших в цех с Номером 2 из цеха с Номером 1 всегда меньше или равно.
Пусть: I - ЦехНомер 1, I+1 - ЦехНомер 2, I+2 - ЦехНомер 3.
(Тоесть КоличествоДеталей(I) >= КоличествоДеталей(I+1) >= КоличествоДеталей(I+2))

Но бывают такие случае, что - КоличествоДеталей(I+1) >= КоличествоДеталей(I).

Вот надо выловить такие случаи и вывести их на экран. Все детали какие лишние и их количество.

Но есть один неприятный момент как путь следования детали. Тоесть Деталь может пойти по цехам: 1 - 23 - 45, а может и по 2 - 56 - 7 - 24. Это надо какимто образом учесть.


Подскажите пожйлуйста как это сделать?
11 ноя 09, 18:08    [7916091]     Ответить | Цитировать Сообщить модератору
 Re: Чудо запрос?  [new]
iljy
Member

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

не очень осмысленный вопрос по-моему.... в вашем же собственном примере цех 123 идет после цеха 127, но для 123 деталей 2, а для 127 - одна, и что с этим делать?
11 ноя 09, 18:19    [7916167]     Ответить | Цитировать Сообщить модератору
 Re: Чудо запрос?  [new]
Ken@t
Member

Откуда: 大地
Сообщений: 3264
мне кажется надо просто определить , что ПРЕДЫДУЩИЙ цех не №1 ?
11 ноя 09, 18:22    [7916191]     Ответить | Цитировать Сообщить модератору
 Re: Чудо запрос?  [new]
iljy
Member

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

и что делать, если одна деталь шла 1-3-5, а другая 1-5-3, какой цех раньше - 5 или 3?
11 ноя 09, 18:24    [7916204]     Ответить | Цитировать Сообщить модератору
 Re: Чудо запрос?  [new]
deto4ka
Member

Откуда: Пушкин
Сообщений: 215
iljy,

номер показывает очередность цехов.
Деталь 1 была сначала в 123, потом в 124, 125.
11 ноя 09, 18:25    [7916212]     Ответить | Цитировать Сообщить модератору
 Re: Чудо запрос?  [new]
murzo1
Member

Откуда:
Сообщений: 100
iljy
murzo1,

не очень осмысленный вопрос по-моему.... в вашем же собственном примере цех 123 идет после цеха 127, но для 123 деталей 2, а для 127 - одна, и что с этим делать?


Нет нет, вы вообще не приавильно поняли =)
Цеха 123,124, 125 - это те цеха пото которым в порядке очередности прошла деталь 111111111,
а цеха 127,123 - это те цеха пото которым в порядке очередности прошла деталь 222222222. а Номер это порядок очередности, 1 значит первый, 2 значит второй и т.п.
11 ноя 09, 18:27    [7916230]     Ответить | Цитировать Сообщить модератору
 Re: Чудо запрос?  [new]
deto4ka
Member

Откуда: Пушкин
Сообщений: 215
Как детали заходят в цех?
Все одновременно в 123, а потом по разным? Или 1 - в 123, 2 - в 127, а потом одновременно 1 - в 124, 2 - в 123?
11 ноя 09, 18:29    [7916242]     Ответить | Цитировать Сообщить модератору
 Re: Чудо запрос?  [new]
Ken@t
Member

Откуда: 大地
Сообщений: 3264
murzo1
iljy
murzo1,

не очень осмысленный вопрос по-моему.... в вашем же собственном примере цех 123 идет после цеха 127, но для 123 деталей 2, а для 127 - одна, и что с этим делать?


Нет нет, вы вообще не приавильно поняли =)
Цеха 123,124, 125 - это те цеха пото которым в порядке очередности прошла деталь 111111111,
а цеха 127,123 - это те цеха пото которым в порядке очередности прошла деталь 222222222. а Номер это порядок очередности, 1 значит первый, 2 значит второй и т.п.

ну , скажем , это вы хреново задачу поставили, может начнём с п5 и п6 рекомендаций ?
11 ноя 09, 18:29    [7916245]     Ответить | Цитировать Сообщить модератору
 Re: Чудо запрос?  [new]
iljy
Member

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

номер показывает очередность цехов.
Деталь 1 была сначала в 123, потом в 124, 125.

murzo1
iljy
murzo1,

не очень осмысленный вопрос по-моему.... в вашем же собственном примере цех 123 идет после цеха 127, но для 123 деталей 2, а для 127 - одна, и что с этим делать?


Нет нет, вы вообще не приавильно поняли =)
Цеха 123,124, 125 - это те цеха пото которым в порядке очередности прошла деталь 111111111,
а цеха 127,123 - это те цеха пото которым в порядке очередности прошла деталь 222222222. а Номер это порядок очередности, 1 значит первый, 2 значит второй и т.п.

это я догадался что номер, и что деталь сначала там была, потом там. Мне не понятно как мы КоличествоДеталей(I) считаем, а точнее- как устанавливаем соответствие I - ЦехНомер 1, I+1 - ЦехНомер 2, I+2 - ЦехНомер 3. И что нам это даст в принципе, если даже в примере ТС получаются некорректные значения.
11 ноя 09, 18:32    [7916264]     Ответить | Цитировать Сообщить модератору
 Re: Чудо запрос?  [new]
murzo1
Member

Откуда:
Сообщений: 100
deto4ka
Как детали заходят в цех?
Все одновременно в 123, а потом по разным? Или 1 - в 123, 2 - в 127, а потом одновременно 1 - в 124, 2 - в 123?


Детали могут заходит в произвольном порядке, одна может в 123 цех войти, другая в 134, третья в 56 (это смотря что будут делать из заготовки) притом могут заходить в разные цеха как одновременно , так и в последовательном порядке.
11 ноя 09, 18:34    [7916281]     Ответить | Цитировать Сообщить модератору
 Re: Чудо запрос?  [new]
murzo1
Member

Откуда:
Сообщений: 100
iljy
deto4ka
iljy,

номер показывает очередность цехов.
Деталь 1 была сначала в 123, потом в 124, 125.

murzo1
iljy
murzo1,

не очень осмысленный вопрос по-моему.... в вашем же собственном примере цех 123 идет после цеха 127, но для 123 деталей 2, а для 127 - одна, и что с этим делать?


Нет нет, вы вообще не приавильно поняли =)
Цеха 123,124, 125 - это те цеха пото которым в порядке очередности прошла деталь 111111111,
а цеха 127,123 - это те цеха пото которым в порядке очередности прошла деталь 222222222. а Номер это порядок очередности, 1 значит первый, 2 значит второй и т.п.

это я догадался что номер, и что деталь сначала там была, потом там. Мне не понятно как мы КоличествоДеталей(I) считаем, а точнее- как устанавливаем соответствие I - ЦехНомер 1, I+1 - ЦехНомер 2, I+2 - ЦехНомер 3. И что нам это даст в принципе, если даже в примере ТС получаются некорректные значения.


Ну если бы вы посмотрели на таблицу:

КодДетали|Цех|Номер
-----------------------
111111111|123|0001
111111111|124|0002
111111111|125|0003
222222222|127|0001
222222222|123|0002

, то поняли бы как соответствие находится, еще раз говорю Номер 1 - значит первый цех в котором побывала деталь, Номер 2 это цех в который деталь пошла после первого цеха, и т.п. А если посмотреть на поле КодДетали то можно увидеть что это одна и таже деталь.
11 ноя 09, 18:38    [7916301]     Ответить | Цитировать Сообщить модератору
 Re: Чудо запрос?  [new]
deto4ka
Member

Откуда: Пушкин
Сообщений: 215
Что есть КоличествоДеталей(l)? Что есть l? Номер цеха?
11 ноя 09, 18:38    [7916302]     Ответить | Цитировать Сообщить модератору
 Re: Чудо запрос?  [new]
aleks2
Guest
Ну... если тредстартер не наврал с исходными данными, то можно так
-- детали, возникшие ниоткуда
select T.*
FROM (select * FROM aTable WHERE Номер>1) T
LEFT OUTER JOIN
aTable P
ON T.КодДетали=P.КодДетали AND P.Номер=T.Номер-1
WHERE P.Номер is null
11 ноя 09, 18:42    [7916315]     Ответить | Цитировать Сообщить модератору
 Re: Чудо запрос?  [new]
murzo1
Member

Откуда:
Сообщений: 100
deto4ka
Что есть КоличествоДеталей(l)? Что есть l? Номер цеха?



Копипаст: Пусть: I - ЦехНомер 1, I+1 - ЦехНомер 2, I+2 - ЦехНомер 3.
Под I подразумевается поле Номер.
КоличествоДеталей(l) - тут количество деталей в цехе Номер I (I - это Номер, можеть быть 1 2 3 4 5 6 7 8 9 .....) .
11 ноя 09, 18:43    [7916325]     Ответить | Цитировать Сообщить модератору
 Re: Чудо запрос?  [new]
iljy
Member

Откуда:
Сообщений: 8711
murzo1
Ну если бы вы посмотрели на таблицу:

КодДетали|Цех|Номер
-----------------------
111111111|123|0001
111111111|124|0002
111111111|125|0003
222222222|127|0001
222222222|123|0002

, то поняли бы как соответствие находится, еще раз говорю Номер 1 - значит первый цех в котором побывала деталь, Номер 2 это цех в который деталь пошла после первого цеха, и т.п. А если посмотреть на поле КодДетали то можно увидеть что это одна и таже деталь.

я не имею привычки задавать вопросы не читая.
у вас цех 123 для одной детали имеет номер 0001, для другой - 0002, какое I ему соответствует?
11 ноя 09, 18:44    [7916333]     Ответить | Цитировать Сообщить модератору
 Re: Чудо запрос?  [new]
murzo1
Member

Откуда:
Сообщений: 100
iljy
murzo1
Ну если бы вы посмотрели на таблицу:

КодДетали|Цех|Номер
-----------------------
111111111|123|0001
111111111|124|0002
111111111|125|0003
222222222|127|0001
222222222|123|0002

, то поняли бы как соответствие находится, еще раз говорю Номер 1 - значит первый цех в котором побывала деталь, Номер 2 это цех в который деталь пошла после первого цеха, и т.п. А если посмотреть на поле КодДетали то можно увидеть что это одна и таже деталь.

я не имею привычки задавать вопросы не читая.
у вас цех 123 для одной детали имеет номер 0001, для другой - 0002, какое I ему соответствует?


Это лиш значит что Одна деталь сразу идет на обработку в этот цех, а другая попадает туда уже обработанная с другого цеха. Тоесть для Одного вырианта будет I, для другого I + 1.
В чем и хитрость данной задачи.
11 ноя 09, 18:50    [7916364]     Ответить | Цитировать Сообщить модератору
 Re: Чудо запрос?  [new]
deto4ka
Member

Откуда: Пушкин
Сообщений: 215
murzo1

Под I подразумевается поле Номер.
КоличествоДеталей(l) - тут количество деталей в цехе Номер I (I - это Номер, можеть быть 1 2 3 4 5 6 7 8 9 .....) .

Тогда получается, что в цехе один находятся 2 детали. Но номер цеха 1 одной 123, у другой 127.
Непонятная величина КоличествоДеталей. Поясните.
А вариант aleks2 Вам не подходит?
11 ноя 09, 18:53    [7916381]     Ответить | Цитировать Сообщить модератору
 Re: Чудо запрос?  [new]
aleks2
Guest
aleks2
Ну... если тредстартер не наврал с исходными данными, то можно так
-- детали, возникшие ниоткуда
select T.*
FROM (select * FROM aTable WHERE Номер>1) T
LEFT OUTER JOIN
aTable P
ON T.КодДетали=P.КодДетали AND P.Номер=T.Номер-1
WHERE P.Номер is null


Чукча явное НЕ читатель.
11 ноя 09, 18:53    [7916382]     Ответить | Цитировать Сообщить модератору
 Re: Чудо запрос?  [new]
murzo1
Member

Откуда:
Сообщений: 100
aleks2
aleks2
Ну... если тредстартер не наврал с исходными данными, то можно так
-- детали, возникшие ниоткуда
select T.*
FROM (select * FROM aTable WHERE Номер>1) T
LEFT OUTER JOIN
aTable P
ON T.КодДетали=P.КодДетали AND P.Номер=T.Номер-1
WHERE P.Номер is null


Чукча явное НЕ читатель.


Чукча читать, просто он отвечать на вопросы , спасибо большое, завтра на работе опробую ваш запрос!
11 ноя 09, 18:55    [7916386]     Ответить | Цитировать Сообщить модератору
 Re: Чудо запрос?  [new]
murzo1
Member

Откуда:
Сообщений: 100
aleks2
aleks2
Ну... если тредстартер не наврал с исходными данными, то можно так
-- детали, возникшие ниоткуда
select T.*
FROM (select * FROM aTable WHERE Номер>1) T
LEFT OUTER JOIN
aTable P
ON T.КодДетали=P.КодДетали AND P.Номер=T.Номер-1
WHERE P.Номер is null


Чукча явное НЕ читатель.


Попробовал я данный скрип в деле и мне всегда выводятся пусты значения, хотя детали возникшие ниоткуда всетаки имеются. WHERE P.Номер is null - а поле Номер не может быть null, там всегда есть цифры. Или я просто запрос не понял?
12 ноя 09, 17:57    [7922236]     Ответить | Цитировать Сообщить модератору
 Re: Чудо запрос?  [new]
aleks2
Guest
Дискуссия была бы более предметна, ежели бы ты удосужился привести данные, содержащие эти лишние детали и ткнул бы пальцем в них.

А так, сочувствую, но помочь ничем не могу...
12 ноя 09, 18:24    [7922350]     Ответить | Цитировать Сообщить модератору
 Re: Чудо запрос?  [new]
Ken@t
Member

Откуда: 大地
Сообщений: 3264
aleks2
Дискуссия была бы более предметна, ежели бы ты удосужился привести данные, содержащие эти лишние детали и ткнул бы пальцем в них.

А так, сочувствую, но помочь ничем не могу...

угу, 3тим постом написал ему об этом.
какие-то они странные эти программеры пошли, ни документацию почитать, ни вопрос составить не могут. ну да ладно , "нет ножек - нет шоколодки "(c)
12 ноя 09, 18:48    [7922446]     Ответить | Цитировать Сообщить модератору
 Re: Чудо запрос?  [new]
Ozzy-Osbourne
Member

Откуда: Balashikha
Сообщений: 139
из фразы:
автор
Номер - номер цеха по очередности в которые заходила деталь.
- делаю вывод, что в задаче надо найти ситуации, при которых обработка некоторой детали есть натуральный ряд с пропусками. То есть, когда вместо последовательности обработки "1,2,3,4,5,6,7" для какого-то изделия есть вот это: "1,2,4,5,6,7" (нет обработки с номером 3).
Ведь в реальности запросто может быть так:
ДетальЦехN обработки
1771241
1771212
1771253
2778211
2778242
2779291
2779242
2788221
2788242
2799271
2799242
Здесь цех № 24 в роли "первой мясорубки" выступил один раз, для детали 1771. А в роли "второй мясорубки" - четыре раза, для четырёх ДРУГИХ деталей (2778, 2779, 2788, 2799). ИМХО, это вполне допустимо (детали-то разные).
Но тогда для i=1 имеем cnt(i)=1, а для i+1=2 имеем cnt(i+1)=cnt(2)=4 - нарушение условия, указанного в первоначальном сообщении ТС.

ВОПРОС АВТОРУ: правильно ли понимаю, что на самом деле надо отлавливать детали, поступившие на обработку номер N и при этом НЕ поступавшие на обработку номер N-1 (где N>=2) ?
Если да, то всё просто
1) test data
+
declare @t table(p int, d int, rn int) -- p=деталь, d=цех, rn=номер обработки
insert @t select 111111111,123,1
insert @t select 111111111,124,2
insert @t select 111111111,125,3
insert @t select 222222222,127,1
insert @t select 222222222,123,2

--- some more test data
insert @t select 1771,24,1
insert @t select 1771,21,2
insert @t select 1771,25,3


insert @t select 4777,21,1
insert @t select 4777,22,2
--insert @t select 4777,23,3
insert @t select 4777,24,4
--insert @t select 4777,25,5
insert @t select 4777,26,6

insert @t select 2778,21,1
insert @t select 2778,24,2

--insert @t select 3779,22,1
insert @t select 3779,23,2
insert @t select 3779,24,3

insert @t select 2780,22,1
insert @t select 2780,24,2

insert @t select 2781,23,1
insert @t select 2781,24,2

insert @t select 3782,25,1
insert @t select 3782,21,2
insert @t select 3782,24,3

insert @t select 7787,26,1
insert @t select 7787,27,2
insert @t select 7787,23,3
insert @t select 7787,21,4
insert @t select 7787,25,5
--insert @t select 7787,22,6
insert @t select 7787,24,7

2) query:
select t1.d,t1.p,t1.rn 
       ,err=case when t2.p is not null or t1.rn=1 then '   ' else '!!!' end
from @t t1
left join @t t2 on t1.p=t2.p and t1.rn=t2.rn+1
order by t1.d,t1.rn
(поле `err` будет содержать `!!!` для проблемных строк)

Если я неверно всё понял, то потрудитесь привести нормальный скрипт с более-менее полными ситуациями по вашим "железкам" (впрочем, об этом Вас здесь уже просили). Особенно - когда возникает ситуация, требующая "отлова".
13 ноя 09, 01:37    [7923419]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить