powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Помогите, пожалуйста с запросом
23 сообщений из 23, страница 1 из 1
Помогите, пожалуйста с запросом
    #39593679
katish444
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте
Третий день ломаю голову над преображением таблицы.
Сейчас объясню на пальцах. Бурят скважину, из нее вытаскивают керн и геолог его описывает. У него программа состоит из четырех вкладок, на каждой вкладке свои "от-до", чтобы знать о каком интервале идет речь.
Сама таблица выглядит так


declare @GEODETAIL table (Holeid varchar(20), geolfrom float, geolto float, name varchar(20),value varchar(20))
insert into @GEODETAIL (holeid, geolfrom, geolto, name, value) values
('hr-1',0,8,'Lith_RockName','Песчанник'),
('hr-1',8,50,'Lith_RockName','Алевролит'),
('hr-1',50,100,'Lith_RockName','Известняк'),
('hr-1',100,108,'Lith_RockName','Гравелиты'),
('hr-1',108,200,'Lith_RockName','Алевролиты'),
('hr-1',0,5,'Sec_RockName','Глина'),
('hr-1',30,38,'Alt_RockName','Переслаивание'),
('hr-1',120,180,'Min_RockName','Минерализация'),
('hr-1',190,200,'Min_RockName','Минерализация')
select * from @GEODETAIL

Но в таком виде она не читаема, как мне ее переделать в такую как на картинке? Самое главные чтобы подынтервали совпадали с основным интервалом?


Кажется у меня кривые руки...
...
Рейтинг: 0 / 0
Помогите, пожалуйста с запросом
    #39593681
katish444
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Очень прошу вас помочь...Я уже с ума схожу - ничего не получается...
Добрый, Копеллы, Дамирович и другие гуру эскюэля...Я вас очень жду)))
...
Рейтинг: 0 / 0
Помогите, пожалуйста с запросом
    #39593685
Kopelly
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
katish444,

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
declare @GEODETAIL table (Holeid varchar(20), geolfrom float, geolto float, name varchar(20),value varchar(20))
insert into @GEODETAIL (holeid, geolfrom, geolto, name, value) values
('hr-1',0,8,'Lith_RockName','Песчанник'),
('hr-1',8,50,'Lith_RockName','Алевролит'),
('hr-1',50,100,'Lith_RockName','Известняк'),
('hr-1',100,108,'Lith_RockName','Гравелиты'),
('hr-1',108,200,'Lith_RockName','Алевролиты'),
('hr-1',0,5,'Sec_RockName','Глина'),
('hr-1',30,38,'Alt_RockName','Переслаивание'),
('hr-1',120,180,'Min_RockName','Минерализация'),
('hr-1',190,200,'Min_RockName','Минерализация')
select a.*,others.* from @GEODETAIL a 
outer apply (Select * From (Select geolfrom as geolfrom_sec, geolto as geolto_sec, value as 'Sec_RockName',
                                   row_number() over (order by geolfrom) as rn_sec 
                              From @GEODETAIL b 
                             Where a.holeid = b.holeid and b.name = 'Sec_RockName' 
                               and a.geolto>b.geolfrom and a.geolfrom<=b.geolto) Sec
					  full join 
					        (Select geolfrom as geolfrom_alt, geolto as geolto_alt, value as 'Alt_RockName',
                                   row_number() over (order by geolfrom) as rn_alt
                              From @GEODETAIL b 
                             Where a.holeid = b.holeid and b.name = 'Alt_RockName' 
                               and a.geolto>b.geolfrom and a.geolfrom<=b.geolto) alt
						 on rn_sec = rn_alt
					  full join 
					        (Select geolfrom as geolfrom_min, geolto as geolto_min, value as 'Min_RockName',
                                   row_number() over (order by geolfrom) as rn_min
                              From @GEODETAIL b 
                             Where a.holeid = b.holeid and b.name = 'Min_RockName' 
                               and a.geolto>b.geolfrom and a.geolfrom<=b.geolto) min
						 on isnull(rn_sec,rn_alt) = rn_min
) others
WHere a.name = 'Lith_RockName'
...
Рейтинг: 0 / 0
Помогите, пожалуйста с запросом
    #39593700
katish444
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Kopelly, спасибо большое
Эх как бы мне научится такому виртуозному владению

Буду сейчас изучать скрипт, может если пойму, то в будущем и сама смогу
...
Рейтинг: 0 / 0
Помогите, пожалуйста с запросом
    #39593705
katish444
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Подскажи пожалуйста, а как избежать дублирование первого столбца, ну чтобы вместо дубликатов тоже NULL был

Kopellykatish444,

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
declare @GEODETAIL table (Holeid varchar(20), geolfrom float, geolto float, name varchar(20),value varchar(20))
insert into @GEODETAIL (holeid, geolfrom, geolto, name, value) values
('hr-1',0,8,'Lith_RockName','Песчанник'),
('hr-1',8,50,'Lith_RockName','Алевролит'),
('hr-1',50,100,'Lith_RockName','Известняк'),
('hr-1',100,108,'Lith_RockName','Гравелиты'),
('hr-1',108,200,'Lith_RockName','Алевролиты'),
('hr-1',0,5,'Sec_RockName','Глина'),
('hr-1',30,38,'Alt_RockName','Переслаивание'),
('hr-1',120,180,'Min_RockName','Минерализация'),
('hr-1',190,200,'Min_RockName','Минерализация')
select a.*,others.* from @GEODETAIL a 
outer apply (Select * From (Select geolfrom as geolfrom_sec, geolto as geolto_sec, value as 'Sec_RockName',
                                   row_number() over (order by geolfrom) as rn_sec 
                              From @GEODETAIL b 
                             Where a.holeid = b.holeid and b.name = 'Sec_RockName' 
                               and a.geolto>b.geolfrom and a.geolfrom<=b.geolto) Sec
					  full join 
					        (Select geolfrom as geolfrom_alt, geolto as geolto_alt, value as 'Alt_RockName',
                                   row_number() over (order by geolfrom) as rn_alt
                              From @GEODETAIL b 
                             Where a.holeid = b.holeid and b.name = 'Alt_RockName' 
                               and a.geolto>b.geolfrom and a.geolfrom<=b.geolto) alt
						 on rn_sec = rn_alt
					  full join 
					        (Select geolfrom as geolfrom_min, geolto as geolto_min, value as 'Min_RockName',
                                   row_number() over (order by geolfrom) as rn_min
                              From @GEODETAIL b 
                             Where a.holeid = b.holeid and b.name = 'Min_RockName' 
                               and a.geolto>b.geolfrom and a.geolfrom<=b.geolto) min
						 on isnull(rn_sec,rn_alt) = rn_min
) others
WHere a.name = 'Lith_RockName'
...
Рейтинг: 0 / 0
Помогите, пожалуйста с запросом
    #39593716
katish444как

Kopellykatish444,

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
declare @GEODETAIL table (Holeid varchar(20), geolfrom float, geolto float, name varchar(20),value varchar(20))
insert into @GEODETAIL (holeid, geolfrom, geolto, name, value) values
('hr-1',0,8,'Lith_RockName','Песчанник'),
('hr-1',8,50,'Lith_RockName','Алевролит'),
('hr-1',50,100,'Lith_RockName','Известняк'),
('hr-1',100,108,'Lith_RockName','Гравелиты'),
('hr-1',108,200,'Lith_RockName','Алевролиты'),
('hr-1',0,5,'Sec_RockName','Глина'),
('hr-1',30,38,'Alt_RockName','Переслаивание'),
('hr-1',120,180,'Min_RockName','Минерализация'),
('hr-1',190,200,'Min_RockName','Минерализация')
 select case row_number() over(partition by a.holeid order by a.geolfrom) when 1 then a.holeid end as x_holeid
      , a.*,others.* from @GEODETAIL a 
outer apply (Select * From (Select geolfrom as geolfrom_sec, geolto as geolto_sec, value as 'Sec_RockName',
                                   row_number() over (order by geolfrom) as rn_sec 
                              From @GEODETAIL b 
                             Where a.holeid = b.holeid and b.name = 'Sec_RockName' 
                               and a.geolto>b.geolfrom and a.geolfrom<=b.geolto) Sec
					  full join 
					        (Select geolfrom as geolfrom_alt, geolto as geolto_alt, value as 'Alt_RockName',
                                   row_number() over (order by geolfrom) as rn_alt
                              From @GEODETAIL b 
                             Where a.holeid = b.holeid and b.name = 'Alt_RockName' 
                               and a.geolto>b.geolfrom and a.geolfrom<=b.geolto) alt
						 on rn_sec = rn_alt
					  full join 
					        (Select geolfrom as geolfrom_min, geolto as geolto_min, value as 'Min_RockName',
                                   row_number() over (order by geolfrom) as rn_min
                              From @GEODETAIL b 
                             Where a.holeid = b.holeid and b.name = 'Min_RockName' 
                               and a.geolto>b.geolfrom and a.geolfrom<=b.geolto) min
						 on isnull(rn_sec,rn_alt) = rn_min
) others
WHere a.name = 'Lith_RockName'

так
...
Рейтинг: 0 / 0
Помогите, пожалуйста с запросом
    #39593730
katish444
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый Э - Эх, все равно дублирует
...
Рейтинг: 0 / 0
Помогите, пожалуйста с запросом
    #39593731
katish444
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый Э - Эх,
тьфу, не то вообще приложила
...
Рейтинг: 0 / 0
Помогите, пожалуйста с запросом
    #39593739
katish444,

так я тебе на примере поля holeid показал общий подход к реализации твоей хотелки в виде нового поля x_holeid.
уж на остальные поля, будь добра, распиши сама... копи-паст + замена имени столбца, думается, посильная для тебя операция?
можно по принципу товарища Kopelly - в outer apply запихать и выводить в том виде, в каком нужно...
...
Рейтинг: 0 / 0
Помогите, пожалуйста с запросом
    #39593742
katish444
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
да, спасибо
я поняла. С меня шоколадка))Добрый Э - Эхkatish444,

так я тебе на примере поля holeid показал общий подход к реализации твоей хотелки в виде нового поля x_holeid.
уж на остальные поля, будь добра, распиши сама... копи-паст + замена имени столбца, думается, посильная для тебя операция?
можно по принципу товарища Kopelly - в outer apply запихать и выводить в том виде, в каком нужно...
...
Рейтинг: 0 / 0
Помогите, пожалуйста с запросом
    #39593743
katish444
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Хотя я вам уже не просто шоколадку, а ящик коньяка должна)))
...
Рейтинг: 0 / 0
Помогите, пожалуйста с запросом
    #39593935
katish444
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый Э - Эхkatish444,

так я тебе на примере поля holeid показал общий подход к реализации твоей хотелки в виде нового поля x_holeid.
уж на остальные поля, будь добра, распиши сама... копи-паст + замена имени столбца, думается, посильная для тебя операция?
можно по принципу товарища Kopelly - в outer apply запихать и выводить в том виде, в каком нужно...

Я изменила, но теперь наоборот много чего пропало. Подскажи пожалуйста что не так?
select case row_number() over(partition by a.holeid order by a.geolfrom) when 1 then a.holeid end as x_holeid,
case row_number() over(partition by a.geolfrom order by a.geolfrom) when 1 then a.GEOLFROM end as geol_from,
case row_number() over(partition by a.geolto order by a.geolfrom) when 1 then a.GEOLTO end as geol_to,
case row_number() over(partition by a.value order by a.geolfrom) when 1 then a.VALUE end as Lith_RockNameee,
a.GEOLFROM,a.GEOLTO,a.VALUE as Lith_RockName ,geolfrom_sec,geolto,Lith3_RockName,geolfrom_alt,geolto_alt,Alteration,geolfrom_min,geolto_min,Mineralisation from GEODETAILS a
outer apply (Select * From (Select geolfrom as geolfrom_sec, geolto as geolto_sec, value as 'Lith3_RockName',
row_number() over (order by geolfrom) as rn_sec
From GEODETAILS b
Where a.holeid = b.holeid and b.name = 'Lith3_RockName'
and a.geolto>b.geolfrom and a.geolfrom<=b.geolto) Sec
full join
(Select geolfrom as geolfrom_alt, geolto as geolto_alt, value as 'Alteration',
row_number() over (order by geolfrom) as rn_alt
From GEODETAILS b
Where a.holeid = b.holeid and b.name = 'Alteration'
and a.geolto>b.geolfrom and a.geolfrom<=b.geolto) alt
on rn_sec = rn_alt
full join
(Select geolfrom as geolfrom_min, geolto as geolto_min, value as 'Mineralisation',
row_number() over (order by geolfrom) as rn_min
From GEODETAILS b
Where a.holeid = b.holeid and b.name = 'Mineralisation'
and a.geolto>b.geolfrom and a.geolfrom<=b.geolto) min
on isnull(rn_sec,rn_alt) = rn_min
) others
WHere a.name = 'Lith_RockName' and holeid='uzuz-17-002'order by a.GEOLFROM
...
Рейтинг: 0 / 0
Помогите, пожалуйста с запросом
    #39593942
Kopelly
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
katish444,
А если так:

select case row_number() over(partition by a.holeid order by a.geolfrom) when 1 then a.holeid end as x_holeid,
case row_number() over(partition by a.holeid, a.geolfrom order by a.geolfrom) when 1 then a.GEOLFROM end as geol_from,
case row_number() over(partition by a.holeid,a.geolfrom, a.geolto order by a.geolfrom) when 1 then a.GEOLTO end as geol_to,
case row_number() over(partition by a.holeid,a.geolfrom,a.geolto, a.value order by a.geolfrom) when 1 then a.VALUE end as Lith_RockNameee,
...
Рейтинг: 0 / 0
Помогите, пожалуйста с запросом
    #39593945
katish444
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Урра! Все как нужно! Пойду в пляс!
Спасибо огромнейшее


Kopellykatish444,
А если так:

select case row_number() over(partition by a.holeid order by a.geolfrom) when 1 then a.holeid end as x_holeid,
case row_number() over(partition by a.holeid, a.geolfrom order by a.geolfrom) when 1 then a.GEOLFROM end as geol_from,
case row_number() over(partition by a.holeid,a.geolfrom, a.geolto order by a.geolfrom) when 1 then a.GEOLTO end as geol_to,
case row_number() over(partition by a.holeid,a.geolfrom,a.geolto, a.value order by a.geolfrom) when 1 then a.VALUE end as Lith_RockNameee,
...
Рейтинг: 0 / 0
Помогите, пожалуйста с запросом
    #39593966
katish444
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Теперь в других столбцах дублирует...
Рада я рабовалась
Теперь остальные столбцы засунуть в CASE, но так почему то не срабатывает...

Kopellykatish444,
А если так:

select case row_number() over(partition by a.holeid order by a.geolfrom) when 1 then a.holeid end as x_holeid,
case row_number() over(partition by a.holeid, a.geolfrom order by a.geolfrom) when 1 then a.GEOLFROM end as geol_from,
case row_number() over(partition by a.holeid,a.geolfrom, a.geolto order by a.geolfrom) when 1 then a.GEOLTO end as geol_to,
case row_number() over(partition by a.holeid,a.geolfrom,a.geolto, a.value order by a.geolfrom) when 1 then a.VALUE end as Lith_RockNameee,
...
Рейтинг: 0 / 0
Помогите, пожалуйста с запросом
    #39593970
Фотография Konst_One
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вы явно ерундой занимаетесь, вместо этого бы взяли бы Excel и вытащили бы данные с SQL.
там есть специальные средства для анализа, или посмотрите в сторону BI
...
Рейтинг: 0 / 0
Помогите, пожалуйста с запросом
    #39593979
katish444
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Программа в которой я работаю понимает только SQL и работать с экселем не умеет
Konst_Oneвы явно ерундой занимаетесь, вместо этого бы взяли бы Excel и вытащили бы данные с SQL.
там есть специальные средства для анализа, или посмотрите в сторону BI
...
Рейтинг: 0 / 0
Помогите, пожалуйста с запросом
    #39593991
Kopelly
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
katish444,
Замени во всех (трёх) местах
and a.geolto>b.geolfrom and a.geolfrom <= b.geolto
На
and a.geolto>b.geolfrom and a.geolfrom < b.geolto
...
Рейтинг: 0 / 0
Помогите, пожалуйста с запросом
    #39593994
Kopelly
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kopelly,
Лишние повторы уйдут, а нужные (которые идут на несколько основных интервалов) - остануться
...
Рейтинг: 0 / 0
Помогите, пожалуйста с запросом
    #39594004
katish444
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
К сожалению, не сработало. Все заменила. Сейчас попробую для всех CASE создать

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
[SUP]
select case row_number() over(partition by a.holeid order by a.geolfrom) when 1 then a.holeid end as x_holeid, 
case row_number() over(partition by a.holeid,a.geolfrom order by a.geolfrom) when 1 then a.GEOLFROM end as geol_from,
case row_number() over(partition by a.holeid,a.geolfrom,a.geolto order by a.geolfrom) when 1 then a.GEOLTO end as geol_to,
case row_number() over(partition by a.holeid,a.geolfrom,a.geolto,a.value order by a.geolfrom) when 1 then a.VALUE end as Lith_RockNameee,



geolfrom_sec,geolto_sec,Lith3_RockName,geolfrom_alt,geolto_alt,Alteration,geolfrom_min,geolto_min,Mineralisation from GEODETAILS a 
outer apply (Select * From (Select geolfrom as geolfrom_sec, geolto as geolto_sec, value as 'Lith3_RockName',
                                   row_number() over (order by geolfrom) as rn_sec 
                              From GEODETAILS b 
                             Where a.holeid = b.holeid and b.name = 'Lith3_RockName' 
                               and a.geolto>b.geolfrom and a.geolfrom<b.geolto) Sec
					  full join 
					        (Select geolfrom as geolfrom_alt, geolto as geolto_alt, value as 'Alteration',
                                   row_number() over (order by geolfrom) as rn_alt
                              From GEODETAILS b 
                             Where a.holeid = b.holeid and b.name = 'Alteration' 
                               and a.geolto>b.geolfrom and a.geolfrom<b.geolto) alt
						 on rn_sec = rn_alt
					  full join 
					        (Select geolfrom as geolfrom_min, geolto as geolto_min, value as 'Mineralisation',
                                   row_number() over (order by geolfrom) as rn_min
                              From GEODETAILS b 
                             Where a.holeid = b.holeid and b.name = 'Mineralisation' 
                               and a.geolto>b.geolfrom and a.geolfrom<b.geolto) min on isnull(rn_sec,rn_alt) = rn_min
) others
WHere a.name = 'Lith_RockName'[/SUB]



KopellyKopelly,
Лишние повторы уйдут, а нужные (которые идут на несколько основных интервалов) - остануться
...
Рейтинг: 0 / 0
Помогите, пожалуйста с запросом
    #39594007
Kopelly
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
katish444К сожалению, не сработало. Все заменила. Сейчас попробую для всех CASE создать
Покажи результат.
...
Рейтинг: 0 / 0
Помогите, пожалуйста с запросом
    #39594008
Фотография Konst_One
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
всё равно советую в сторону MS BI посмотреть, у вас же чистый OLAP
...
Рейтинг: 0 / 0
Помогите, пожалуйста с запросом
    #39595310
katish444
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Kopellykatish444К сожалению, не сработало. Все заменила. Сейчас попробую для всех CASE создать
Покажи результат.
Я поняла. Минерализация по идее не бьет с основным интервалом, поэтому она попадает в оба интервала
Так что скрипт идеален, это просто особенность данных)) ) Спасибо
...
Рейтинг: 0 / 0
23 сообщений из 23, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Помогите, пожалуйста с запросом
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]