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

Откуда:
Сообщений: 261
Добрый день.
Подскажите, пожалуйста, как избежать пустых ячеек и поднять текст в строку. Ведь интервал один и тот же, а он берет и дублирует.
Вот таблица
declare  @geodetail  table (holeid varchar(255),projectcode varchar(255),[value] varchar(255), name varchar(20))
insert into @geodetail  (holeid,projectcode ,[value] , name) values ('UZ-001','uz', 'Alteration','HH')
insert into @geodetail  (holeid,projectcode ,  [value] , name) values ('UZ-001','uz', 'Alteration2','GT')
insert into @geodetail  (holeid,projectcode ,  [value] , name) values ('UZ-001','uz', 'Alt_inten','JH')
insert into @geodetail  (holeid,projectcode ,  [value] , name) values ('UZ-001','uz', 'Alt_inten2','OO')
insert into @geodetail  (holeid,projectcode ,  [value] , name) values ('UZ-001','uz', 'Alt_occur','DR')
insert into @geodetail  (holeid,projectcode ,  [value] , name) values ('UZ-001','uz', 'Alt_occur2','UU')
insert into @geodetail  (holeid,projectcode ,  [value] , name) values ('UZ-001','uz', 'Alteration3','GTRR')

Вот скрипт
select * from (

SELECT [HOLEID], 
       [PROJECTCODE], 
       [GEOLFROM], 
       [GEOLTO], 
       (CASE
            WHEN name LIKE 'Alteration%'
            THEN value
        END) A, 
       (CASE
            WHEN name LIKE 'Alt_inten%'
            THEN value
        END) I, 
       (CASE
            WHEN name LIKE 'Alt_occu%'
            THEN value
        END) O
FROM GEODETAILS
WHERE PROJECTCODE = 'dz')f where (a is not null or i is not null or o is not null) 
group by [HOLEID], 
       [PROJECTCODE], 
       [GEOLFROM], 
       [GEOLTO],a,i,o


Что я делаю не так? почему они разделяются и как это исправить?
За ранее, спасибо

К сообщению приложен файл. Размер - 35Kb
24 авг 18, 13:16    [21653045]     Ответить | Цитировать Сообщить модератору
 Re: Как "поднять" столбцы в ряд?  [new]
Посетитель
Member

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

уберите
a,i,o из группировки и оберните кейсы в max, например
24 авг 18, 13:19    [21653050]     Ответить | Цитировать Сообщить модератору
 Re: Как "поднять" столбцы в ряд?  [new]
katish444
Member

Откуда:
Сообщений: 261
Посетитель, точно! спасибо большое
24 авг 18, 13:27    [21653067]     Ответить | Цитировать Сообщить модератору
 Re: Как "поднять" столбцы в ряд?  [new]
katish444
Member

Откуда:
Сообщений: 261
Посетитель, я немного рано обрадовалась. При использовании min или max он выдает только одно значение.
А мне необходимо, чтобы все столбца Alt1 Alt2 Alt3 собирались в единый столбец.
Вот такие у меня сейчас поля, нужно чтобы А1 и А2 и А3 были в одном столбце, и все равно что интервалы будут дублироваться
--select holeid, geolfrom [From], geolto [To], (concat(A,(case when m is not null then '('+m+')' else '' end)))Alt_Min
SELECT *
FROM
(
    SELECT [HOLEID], 
           [PROJECTCODE], 
           [GEOLFROM], 
           [GEOLTO], 
           MIN(CASE
                   WHEN name LIKE 'alt1_Min' --or name LIKE 'alt2_Min' or name LIKE 'alt3_Min'
                   THEN value
               END) A, 
           MIN(CASE
                   WHEN name LIKE 'alt1_Morphology' --or name LIKE 'alt1_Morphology' or name LIKE 'alt1_Morphology'
                   THEN value
               END) M, 
           MIN(CASE
                   WHEN name LIKE 'alt2_Min'
                   THEN value
               END) A2, 
           MIN(CASE
                   WHEN name LIKE 'alt2_Morphology'
                   THEN value
               END) M2, 
           MIN(CASE
                   WHEN name LIKE 'alt3_Min'
                   THEN value
               END) A3, 
           MIN(CASE
                   WHEN name LIKE 'alt3_Morphology'
                   THEN value
               END) M3
    FROM GEODETAILS
    WHERE PROJECTCODE = 'dz'
    GROUP BY [HOLEID], 
             [PROJECTCODE], 
             [GEOLFROM], --name,value,
             [GEOLTO]
) f
WHERE(a IS NOT NULL
      OR m IS NOT NULL);


К сообщению приложен файл. Размер - 30Kb
25 авг 18, 06:25    [21653661]     Ответить | Цитировать Сообщить модератору
 Re: Как "поднять" столбцы в ряд?  [new]
katish444
Member

Откуда:
Сообщений: 261
Есть же union!
Как я про него забыла
25 авг 18, 06:34    [21653662]     Ответить | Цитировать Сообщить модератору
 Re: Как "поднять" столбцы в ряд?  [new]
Руслан Дамирович
Member

Откуда: Резиновая нерезиновая
Сообщений: 940
Извращения какие-то...
DECLARE @t TABLE ( 
  [holeid] INT,
  [projectcode] VARCHAR(2),
  [geolfrom] INT,
  [geolto] INT,
  [name] VARCHAR(20),
  [value] VARCHAR(10)
)
;
INSERT INTO @t
VALUES 
  ( 1, 'DZ',  1,  5, 'alt1_Min', 'aaa' ),
  ( 1, 'DZ',  6, 15, 'alt2_Min', 'bb' ),
  ( 1, 'DZ', 18, 47, 'alt3_Min', 'aacca' ),
  ( 1, 'DZ',  1,  5, 'alt1_Morphology', 'aaa' ),
  ( 1, 'DZ',  1,  5, 'alt1_Min', 'bbb' ),
  ( 1, 'DZ',  1,  5, 'alt2_Min', 'aaa' ),
  ( 1, 'DZ',  1,  5, 'alt1_Min', 'aaa' ),
  ( 1, 'DZ',  1,  5, 'alt3_Min', 'aaa' ),
  ( 1, 'DZ',  1,  5, 'alt1_Min', 'aaa' ),
  ( 1, 'DZ',  1,  5, 'alt2_Morphology', 'aaa' ),
  ( 1, 'DZ',  1,  5, 'alt1_Min', 'aaa' ),
  ( 1, 'DZ',  1,  5, 'alt3_Morphology', 'aaa' ),
  ( 1, 'DZ',  1,  5, 'alt1_Min', 'aaa' ),
  ( 1, 'DZ',  1,  5, 'alt1_Min', 'aaa' )
;
WITH
t0 AS (
  SELECT
    *
  FROM
    @t
  WHERE
    [projectcode] = 'dz'
),
t1 AS (
  SELECT DISTINCT
    [holeid], 
    [projectcode], 
    [geolfrom], 
    [geolto]
  FROM
    t0
)
SELECT
  t1.[holeid], 
  t1.[projectcode], 
  t1.[geolfrom], 
  t1.[geolto],
  [alt_min] = STUFF( ( 
      SELECT 
        [*] = ',' + [value]
      FROM
        t0 
      WHERE
            t0.[holeid] = t1.[holeid] 
        AND t0.[projectcode] = t1.[projectcode]
        AND t0.[geolfrom] = t1.[geolfrom]
        AND t0.[geolto] = t1.[geolto]
      FOR XML PATH( '' ) 
    ), 1, 1, '' )
FROM
  t1
; 
27 авг 18, 09:28    [21654573]     Ответить | Цитировать Сообщить модератору
 Re: Как "поднять" столбцы в ряд?  [new]
Руслан Дамирович
Member

Откуда: Резиновая нерезиновая
Сообщений: 940
не выспался. в [alt_min] добавить условие в WHERE
AND t0.[name] LIKE 'ALT%&_MIN' ESCAPE '&'
27 авг 18, 09:31    [21654574]     Ответить | Цитировать Сообщить модератору
 Re: Как "поднять" столбцы в ряд?  [new]
petre
Member

Откуда: Кривой Рог
Сообщений: 42
katish444,

select holeid, geolfrom [From], geolto [To], isnull(A,'')+isnull(A2,'')+isnull(A3,'')
27 авг 18, 10:42    [21654648]     Ответить | Цитировать Сообщить модератору
 Re: Как "поднять" столбцы в ряд?  [new]
Владимир Затуливетер
Member

Откуда:
Сообщений: 427
declare @t table
(
    holeid int
  , projectcode varchar(2)
  , geolfrom int
  , geolto int
  , name varchar(20)
  , value varchar(10)
);

insert into @t
values ( 1, 'DZ', 1, 5, 'alt1_Min', 'aaa' )
     , ( 1, 'DZ', 6, 15, 'alt2_Min', 'bb' )
     , ( 1, 'DZ', 18, 47, 'alt3_Min', 'aacca' )
     , ( 1, 'DZ', 1, 5, 'alt1_Morphology', 'aaa')
     , ( 1, 'DZ', 1, 5, 'alt1_Min', 'bbb' )
     , ( 1, 'DZ', 1, 5, 'alt2_Min', 'aaa' )
     , ( 1, 'DZ', 1, 5, 'alt1_Min', 'aaa' )
     , ( 1, 'DZ', 1, 5, 'alt3_Min', 'aaa' )
     , ( 1, 'DZ', 1, 5, 'alt1_Min', 'aaa' )
     , ( 1, 'DZ', 1, 5, 'alt2_Morphology', 'aaa')     
     , ( 1, 'DZ', 1, 5, 'alt1_Min', 'aaa' )
     , ( 1, 'DZ', 1, 5, 'alt3_Morphology', 'aaa')
     , ( 1, 'DZ', 1, 5, 'alt1_Min', 'aaa' )
     , ( 1, 'DZ', 1, 5, 'alt1_Min', 'aaa' );

select
    holeid
  , projectcode
  , geolfrom
  , geolto
  , string_agg(value, ',')
from @t
where projectcode = 'dz'
      and name like 'ALT%&_MIN' escape '&'
group by holeid
       , projectcode
       , geolfrom
       , geolto
27 авг 18, 11:02    [21654671]     Ответить | Цитировать Сообщить модератору
 Re: Как "поднять" столбцы в ряд?  [new]
katish444
Member

Откуда:
Сообщений: 261
Руслан Дамирович, спасибо большое
28 авг 18, 13:43    [21656157]     Ответить | Цитировать Сообщить модератору
 Re: Как "поднять" столбцы в ряд?  [new]
katish444
Member

Откуда:
Сообщений: 261
Владимир Затуливетер, ух тыж! теперь я знаю функцию escape! Спасибо
28 авг 18, 13:44    [21656163]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить