Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Помогите, пожалуйста с запросом / 23 сообщений из 23, страница 1 из 1
31.01.2018, 07:12
    #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
31.01.2018, 07:14
    #39593681
katish444
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите, пожалуйста с запросом
Очень прошу вас помочь...Я уже с ума схожу - ничего не получается...
Добрый, Копеллы, Дамирович и другие гуру эскюэля...Я вас очень жду)))
...
Рейтинг: 0 / 0
31.01.2018, 07:52
    #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
31.01.2018, 08:46
    #39593700
katish444
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите, пожалуйста с запросом
Kopelly, спасибо большое
Эх как бы мне научится такому виртуозному владению

Буду сейчас изучать скрипт, может если пойму, то в будущем и сама смогу
...
Рейтинг: 0 / 0
31.01.2018, 08:54
    #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
31.01.2018, 09:17
    #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
31.01.2018, 09:42
    #39593730
katish444
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите, пожалуйста с запросом
Добрый Э - Эх, все равно дублирует
...
Рейтинг: 0 / 0
31.01.2018, 09:43
    #39593731
katish444
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите, пожалуйста с запросом
Добрый Э - Эх,
тьфу, не то вообще приложила
...
Рейтинг: 0 / 0
31.01.2018, 10:03
    #39593739
Помогите, пожалуйста с запросом
katish444,

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

так я тебе на примере поля holeid показал общий подход к реализации твоей хотелки в виде нового поля x_holeid.
уж на остальные поля, будь добра, распиши сама... копи-паст + замена имени столбца, думается, посильная для тебя операция?
можно по принципу товарища Kopelly - в outer apply запихать и выводить в том виде, в каком нужно...
...
Рейтинг: 0 / 0
31.01.2018, 10:10
    #39593743
katish444
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите, пожалуйста с запросом
Хотя я вам уже не просто шоколадку, а ящик коньяка должна)))
...
Рейтинг: 0 / 0
31.01.2018, 13:53
    #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
31.01.2018, 13:59
    #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
31.01.2018, 14:01
    #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
31.01.2018, 14:14
    #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
31.01.2018, 14:17
    #39593970
Konst_One
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите, пожалуйста с запросом
вы явно ерундой занимаетесь, вместо этого бы взяли бы Excel и вытащили бы данные с SQL.
там есть специальные средства для анализа, или посмотрите в сторону BI
...
Рейтинг: 0 / 0
31.01.2018, 14:20
    #39593979
katish444
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите, пожалуйста с запросом
Программа в которой я работаю понимает только SQL и работать с экселем не умеет
Konst_Oneвы явно ерундой занимаетесь, вместо этого бы взяли бы Excel и вытащили бы данные с SQL.
там есть специальные средства для анализа, или посмотрите в сторону BI
...
Рейтинг: 0 / 0
31.01.2018, 14:24
    #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
31.01.2018, 14:26
    #39593994
Kopelly
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите, пожалуйста с запросом
Kopelly,
Лишние повторы уйдут, а нужные (которые идут на несколько основных интервалов) - остануться
...
Рейтинг: 0 / 0
31.01.2018, 14:32
    #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
31.01.2018, 14:34
    #39594007
Kopelly
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите, пожалуйста с запросом
katish444К сожалению, не сработало. Все заменила. Сейчас попробую для всех CASE создать
Покажи результат.
...
Рейтинг: 0 / 0
31.01.2018, 14:35
    #39594008
Konst_One
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите, пожалуйста с запросом
всё равно советую в сторону MS BI посмотреть, у вас же чистый OLAP
...
Рейтинг: 0 / 0
02.02.2018, 06:21
    #39595310
katish444
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите, пожалуйста с запросом
Kopellykatish444К сожалению, не сработало. Все заменила. Сейчас попробую для всех CASE создать
Покажи результат.
Я поняла. Минерализация по идее не бьет с основным интервалом, поэтому она попадает в оба интервала
Так что скрипт идеален, это просто особенность данных)) ) Спасибо
...
Рейтинг: 0 / 0
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Помогите, пожалуйста с запросом / 23 сообщений из 23, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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