Добро пожаловать в форум, Guest >> Войти | Регистрация | Поиск | Правила | | В избранное | Подписаться | ||
Все форумы / Microsoft SQL Server |
![]() ![]() |
katish444 Member Откуда: Сообщений: 276 |
Пыталась решить проблему с float/varchar, которая мне ничего не дала.... Вообщем, попытаюсь объяснить человеческим языком. Есть геологическое описание скважины. Например from 1000м to 1200м - "алевролиты", но эти 200 метров бурили не в один день, конечно, а недельку. И для суточного отчета по бурению, надо это геологическое описание вытянуть только на тот интервал, который пробурили сегодня. К примеру с 1122 до 1150. Этот интервал полностью попадает. Вот как базе объяснить, что надо брать ближайшее число from и выдавать описание. А если бурили с 1190 до 1225. Тут захватывает уже новый интервал геологического описания. Не могу придумать, как же выпросить у БД именно те интервалы, которые мне нужны. Есть такая функция, не равно, не больше/равно, а именно ближайшее число. Может Abs(Min(From - EventFromDay)), только не соображу как это в условии прописать Кажется у меня кривые руки... |
25 апр 18, 07:22 [21366483] Ответить | Цитировать Сообщить модератору |
Kopelly Member Откуда: Красноярск Сообщений: 289 |
katish444,Select a.[ID_Скважины], case a.From<b.From Then b.From Else a.From end as [From], case a.To>b.To Then b.To Else a.To end as [To], a.[СуточноеОписание], b.[ОписаниеСлояСкважины] From [СуточныеДанные] a join [ОписаниеСкважины] b on a.[ID_Скважины] = b.[ID_Скважины] and a.From<b.To and a.To>b.From Where a.[Дата] = @Date |
25 апр 18, 07:34 [21366500] Ответить | Цитировать Сообщить модератору |
Kopelly Member Откуда: Красноярск Сообщений: 289 |
katish444, Если за сутки надо показать только один слой: Select a.[ID_Скважины], case a.From<b.From Then b.From Else a.From end as [From], case a.To>b.To Then b.To Else a.To end as [To], a.[СуточноеОписание], b.[ОписаниеСлояСкважины] From [СуточныеДанные] a Outer apply ( Select top 1 b.* From [ОписаниеСкважины] b Where a.[ID_Скважины] = b.[ID_Скважины] and a.From<b.To Order by b.From) b Where a.[Дата] = @Date |
25 апр 18, 07:36 [21366507] Ответить | Цитировать Сообщить модератору |
katish444 Member Откуда: Сообщений: 276 |
Спасибо большое Сейчас разберусь и буду думать как эту уловку вставить в мой скрипт :-) Что бы я делала без тебя, билась бы, наверное, головой о стену.... Спасибо!
|
|||
25 апр 18, 07:49 [21366528] Ответить | Цитировать Сообщить модератору |
Kopelly Member Откуда: Красноярск Сообщений: 289 |
katish444, ОДин слой за сутки наверно так правильнее будет: Select a.[ID_Скважины],a.[From],a.[To],a.[СуточноеОписание], b.[ОписаниеСлояСкважины] From [СуточныеДанные] a join [ОписаниеСкважины] b on a.[ID_Скважины] = b.[ID_Скважины] and a.From<b.To and a.To>b.From Where a.[Дата] = @Date |
25 апр 18, 07:52 [21366531] Ответить | Цитировать Сообщить модератору |
katish444 Member Откуда: Сообщений: 276 |
Нет, если я правильно поняла, то это не пойдет. Ведь значений, где and a.From<b.To and a.To>b.Fromочень много. Все значения меньше 1122, к примеру будут меньше... |
||
25 апр 18, 09:11 [21366666] Ответить | Цитировать Сообщить модератору |
Kopelly Member Откуда: Красноярск Сообщений: 289 |
katish444, Че-то туплю, для одного слоя: Select a.[ID_Скважины],a.[From],a.[To], a.[СуточноеОписание], b.[ОписаниеСлояСкважины] From [СуточныеДанные] a Outer apply ( Select top 1 b.* From [ОписаниеСкважины] b Where a.[ID_Скважины] = b.[ID_Скважины] and a.From<b.To Order by b.From) b Where a.[Дата] = @Date |
25 апр 18, 10:03 [21366820] Ответить | Цитировать Сообщить модератору |
katish444 Member Откуда: Сообщений: 276 |
Kopelly, спасибо большущее! С меня шоколадка))) |
25 апр 18, 11:08 [21367079] Ответить | Цитировать Сообщить модератору |
tip78 Member Откуда: Москва Сообщений: 1260 |
сдаётся мне, вам бы там процедурка с циклом не помешала |
25 апр 18, 11:40 [21367186] Ответить | Цитировать Сообщить модератору |
TaPaK Member Откуда: Kiev Сообщений: 6801 |
курсор + цикл, шобы всё как у людей |
||
25 апр 18, 11:55 [21367255] Ответить | Цитировать Сообщить модератору |
katish444 Member Откуда: Сообщений: 276 |
я не умею... |
||
25 апр 18, 12:27 [21367372] Ответить | Цитировать Сообщить модератору |
katish444 Member Откуда: Сообщений: 276 |
Kopelly,не сработало. Он не выдает значение описания скважины. Пишет NULLSelect a.[holeid],a.[EventFromDAY],a.[EventTOnight], a.[DRILLINGDATE], ( case when b.[NAME] = 'Lith_RockName' then b.[VALUE] end)Lith_RockName From (Select holeid,drillingdate, max( case when [DRILLINGDETAIL].[NAME] = 'EventFrom' and [Shift]='day' then [DRILLINGDETAIL].[VALUE] end)EventFromDAY ,max( case when [DRILLINGDETAIL].[NAME] = 'Eventto' and [Shift]='night'then [DRILLINGDETAIL].[VALUE] end)EventTOnight FROM DRILLINGDETAIL group by HOLEID,drillingdate) a Outer apply ( Select top 1 b.* From [Geodetails] b Where a.[HOLEID] = b.[HOLEID] and a.EventFromDAY<b.GEOLTO Order by b.GEOLTO) b Where a.[DRILLINGDATE] = '15-jul-2017' Group by a.[holeid],a.[DRILLINGDATE],a.[EventFromDAY],a.[EventTOnight],b.NAME,b.VALUE |
25 апр 18, 12:28 [21367378] Ответить | Цитировать Сообщить модератору |
katish444 Member Откуда: Сообщений: 276 |
TaPaK, да не могу я так. Руки то у меня кривые))) SQL изучала на каком-то курсе в школе...Все на этом... |
25 апр 18, 12:30 [21367388] Ответить | Цитировать Сообщить модератору |
katish444 Member Откуда: Сообщений: 276 |
Kopelly, вот... К сообщению приложен файл. Размер - 16Kb |
25 апр 18, 12:31 [21367391] Ответить | Цитировать Сообщить модератору |
katish444 Member Откуда: Сообщений: 276 |
Kopelly, Вот так выглядят таблицы declare @geodetails table (holeid varchar(255),projectcode varchar(255), geofrom float, geoto float,[value] varchar(255), name varchar(20)) insert into @assay (holeid,projectcode , geofrom , geoto ,[value] , name) values ('UZ-001', 'uz', 1075, 1320,'AL','Lith_RockName') insert into @assay (holeid,projectcode , geofrom , geoto ,[value] , name) values ('UZ-001', 'uz', 1045, 1075,'Br','Lith_RockName') declare @drillingdetail table (holeid varchar(255),drillingdate varchar(255), varchar(255), name varchar(20)) insert into @drillingdetail (holeid,drillingdate , [value] , name) values ('UZ-001','15-jul-2017', 'EventFrom','1040') insert into @drillingdetail (holeid,drillingdate , [value] , name) values ('UZ-001','15-jul-2017', 'EventTo','1060') insert into @drillingdetail (holeid,drillingdate , [value] , name) values ('UZ-001','16-jul-2017', 'EventFrom','1150') insert into @drillingdetail (holeid,drillingdate , [value] , name) values ('UZ-001','16-jul-2017', 'EventTo','1172') Получить надо примерно как на картинке ниже |
25 апр 18, 12:41 [21367436] Ответить | Цитировать Сообщить модератору |
katish444 Member Откуда: Сообщений: 276 |
katish444, К сообщению приложен файл. Размер - 19Kb |
25 апр 18, 12:41 [21367437] Ответить | Цитировать Сообщить модератору |
Kopelly Member Откуда: Красноярск Сообщений: 289 |
katish444, Судя по всему не повезло - у первой попавшейся записи [NAME] <> 'Lith_RockName' Select a.[holeid],a.[EventFromDAY],a.[EventTOnight], a.[DRILLINGDATE], b.[VALUE] Lith_RockName From (Select holeid,drillingdate, max( case when [DRILLINGDETAIL].[NAME] = 'EventFrom' and [Shift]='day' then [DRILLINGDETAIL].[VALUE] end)EventFromDAY ,max( case when [DRILLINGDETAIL].[NAME] = 'Eventto' and [Shift]='night'then [DRILLINGDETAIL].[VALUE] end)EventTOnight FROM DRILLINGDETAIL group by HOLEID,drillingdate) a Outer apply ( Select top 1 b.* From [Geodetails] b Where a.[HOLEID] = b.[HOLEID] and a.EventFromDAY<b.GEOLTO and b.[NAME] = 'Lith_RockName' Order by b.GEOLTO) b Where a.[DRILLINGDATE] = '15-jul-2017' Group by a.[holeid],a.[DRILLINGDATE],a.[EventFromDAY],a.[EventTOnight],b.NAME,b.VALUE |
25 апр 18, 12:42 [21367446] Ответить | Цитировать Сообщить модератору |
katish444 Member Откуда: Сообщений: 276 |
Kopelly, О, боги Олимпа! У тебя снова получилось! Спасибо большое! |
25 апр 18, 12:49 [21367476] Ответить | Цитировать Сообщить модератору |
katish444 Member Откуда: Сообщений: 276 |
Kopelly, рано я обрадовалась. Если интервал бурения попадает в два интервала описания, то он берет только первый.... Вот например тут должна быть еще строчка... С геологическим описанием, т.к. в таблице описания интервалы 1136-1175 и следующий 1175-1183 К сообщению приложен файл. Размер - 19Kb |
25 апр 18, 12:54 [21367494] Ответить | Цитировать Сообщить модератору |
katish444 Member Откуда: Сообщений: 276 |
katish444, в принципе, я сделала top 2 врядли они будут бурить больше 40 метров в день. Спасибо |
25 апр 18, 12:57 [21367511] Ответить | Цитировать Сообщить модератору |
Kopelly Member Откуда: Красноярск Сообщений: 289 |
Я же тебе уже писал как получить все слои за день |
||
25 апр 18, 13:05 [21367539] Ответить | Цитировать Сообщить модератору |
katish444 Member Откуда: Сообщений: 276 |
Потому что я глупая, я же вставляю твои идеи в свой скрипт, вот кряхтела я долго - не сработало! Думаю не катит, и что оказалось?! Я просто не заметила, что там WHEN в кейсах не хватает Спасибо большое! Сейчас думаю все попрет! |
||||
25 апр 18, 13:30 [21367636] Ответить | Цитировать Сообщить модератору |
Руслан Дамирович Member Откуда: Резиновая нерезиновая Сообщений: 940 |
Наймите уже Kopelly в штат внештатным консультантом. |
25 апр 18, 16:22 [21368465] Ответить | Цитировать Сообщить модератору |
katish444 Member Откуда: Сообщений: 276 |
давно пора))) |
||
26 апр 18, 09:24 [21369997] Ответить | Цитировать Сообщить модератору |
Все форумы / Microsoft SQL Server | ![]() |