Преобразование нескольких строк в одну строку по идентификатору - PullRequest
0 голосов
/ 31 января 2019

Я пытаюсь добиться того, чтобы сгруппировать их по id и создать столбец для date, а также data.

Фон набора данных - это лабораторный результат, полученныйУчастник и некоторые тесты не могут быть приняты в один и тот же день из-за ограничений поста и т. д. Я использую базу данных SQL Server.

Ниже приведены мой DataSet и желаемый вывод.

Пример набора данных:

create table Sample 
(
      Id int,
      LAB_DATE date,
      A_CRE_1 varchar(100),
      B_GLUH_1 varchar(100),
      C_LDL_1 varchar(100),
      D_TG_1 varchar(100),
      E_CHOL_1 varchar(100),
      F_HDL_1 varchar(100),
      G_CRPH_1 varchar(100),
      H_HBA1C_1 varchar(100),
      I_GLU120_1 varchar(100),
      J_GLUF_1 varchar(100),
      K_HCR_1 varchar(100)
)

insert into Sample(Id, LAB_DATE,A_CRE_1, B_GLUH_1,C_LDL_1,E_CHOL_1,F_HDL_1,H_HBA1C_1,K_HCR_1)
values (01, '2017-11-21', '74', '6.4', '2.04', '4.17', '1.64', '6.1', '2.54')

insert into sample (Id, LAB_DATE, I_GLU120_1) 
values (01, '2017-11-22','8.8')

insert into sample (Id, LAB_DATE, D_TG_1) 
values (01, '2017-11-23','0.56')

insert into sample (Id,LAB_DATE,A_CRE_1,B_GLUH_1,C_LDL_1,D_TG_1,E_CHOL_1,F_HDL_1,K_HCR_1)       
values (2,'2018-10-02','57','8.91','2.43','1.28','3.99','1.25','3.19')

insert into sample (Id,LAB_DATE,H_HBA1C_1)                              
values (2,'2018-10-03','8.6')                       

insert into sample (Id,LAB_DATE,J_GLUF_1)                               
values (2,'2018-10-04','7.8')

insert into sample (Id,LAB_DATE,A_CRE_1,B_GLUH_1,C_LDL_1,D_TG_1,E_CHOL_1,F_HDL_1,G_CRPH_1,H_HBA1C_1,K_HCR_1)
values (3,'2016-10-01','100','6.13','3.28','0.94','5.07','1.19','0.27','5.8','4.26')

Желаемый вывод:

ID|LAB_DATE|A_CRE_1|B_GLUH_1|C_LDL_1|Date_TG_1|D_TG_1|E_CHOL_1|F_HDL_1|G_CRPH_1|H_HBA1C_1|Date_GLU120_1|I_GLU120_1|J_GLUF_1|K_HCR_1
1|2017-11-21|74|6.4|2.04|2017-11-23|0.56|4.17|1.64|||6.1|2017-11-22|8.8|||2.54
2|02/10/2018|57|8.91|2.43||1.28|3.99|1.25||03/10/2018|8.6|||04/10/2018|7.8|3.19
3|01/10/2016|100|6.13|3.28||0.94|5.07|1.19|0.27||5.8|||||4.26

enter image description here

Ответы [ 3 ]

0 голосов
/ 31 января 2019

Как предложил @Ben, вы можете использовать group by id и брать min для всех столбцов, как показано ниже.

DECLARE  @Sample as table (
  Id int,
  LAB_DATE date,
  A_CRE_1 varchar(100),
  B_GLUH_1 varchar(100),
  C_LDL_1 varchar(100),
  D_TG_1 varchar(100),
  E_CHOL_1 varchar(100),
  F_HDL_1 varchar(100),
  G_CRPH_1 varchar(100),
  H_HBA1C_1 varchar(100),
  I_GLU120_1 varchar(100),
  J_GLUF_1 varchar(100),
  K_HCR_1 varchar(100))

insert into @Sample(Id, LAB_DATE,A_CRE_1, 
B_GLUH_1,C_LDL_1,E_CHOL_1,F_HDL_1,H_HBA1C_1,K_HCR_1)
values (01,'2017-11-21','74','6.4','2.04','4.17','1.64','6.1','2.54')

insert into @Sample (Id, LAB_DATE, I_GLU120_1) 
values (01, '2017-11-22','8.8')

insert into @Sample (Id, LAB_DATE, D_TG_1) 
values (01, '2017-11-23','0.56')

SELECT s.Id
 , MIN(s.LAB_DATE) AS LAB_DATE
 , MIN(s.A_CRE_1) AS A_CRE_1
 , MIN(s.B_GLUH_1) AS B_GLUH_1
 , MIN(s.C_LDL_1) AS C_LDL_1
 , MIN(s.D_TG_1) AS D_TG_1
 , MIN(s.E_CHOL_1) AS E_CHOL_1
 , MIN(s.F_HDL_1) AS F_HDL_1
 , MIN(s.G_CRPH_1) AS G_CRPH_1
 , MIN(s.H_HBA1C_1) AS H_HBA1C_1
 , MIN(s.I_GLU120_1) AS I_GLU120_1
 , MIN(s.J_GLUF_1) AS J_GLUF_1
 , MIN(s.K_HCR_1) AS K_HCR_1
FROM @Sample AS s
GROUP BY s.Id

Вы также можете проверить функцию SQL Server STUFF.Можете воспользоваться помощью по ссылке ниже https://www.mssqltips.com/sqlservertip/2914/rolling-up-multiple-rows-into-a-single-row-and-column-for-sql-server-data/

0 голосов
/ 31 января 2019

Исходя из моих комментариев о представлении исходных данных, я думаю, что вам следует сделать это (принимая во внимание запрос, который вы прокомментировали)

SELECT 
  ID, 
  MAX(CASE WHEN TestID='1' THEN Results END) [Test_1], 
  MAX(CASE WHEN TestID='2' THEN Results END) [Test_2], 
  MAX(CASE WHEN TestID='1' THEN Result_Date_Time END) Test12Date,
  MAX(CASE WHEN TestID='3' THEN Results END) [Test_3], 
  MAX(CASE WHEN TestID='3' THEN Result_Date_Time END) Test3Date

FROM [tbBloodSample] 
GROUP BY ID 
ORDER BY ID

Примечания: если TestID имеет тип int, не используйте строкикак '1' в вашем запросе, используйте целые числа.Вам не нужен ELSE NULL в регистре - значение по умолчанию равно null, если когда не получилось

Вот шаблон запроса.Тесты 1 и 2 всегда проводятся в один и тот же день, поэтому я задаю их дату только один раз.Тест 3 может быть выполнен позже, может быть таким же, это означает, что даты в test12date и test3date могут быть одинаковыми, могут отличаться

Преобразовать строки в даты после выполнения сводки, чтобы уменьшить количество преобразований

0 голосов
/ 31 января 2019

Вот решение (которое не может справиться с несколькими строками с одинаковым типом идентификатора / образца - вы еще не сказали, что с ними делать)

select * from

  (select Id, LAB_DATE,A_CRE_1, B_GLUH_1,C_LDL_1,E_CHOL_1,F_HDL_1,H_HBA1C_1,K_HCR_1 from sample) s1
  INNER JOIN
  (select Id, LAB_DATE as glu120date, I_GLU120_1 from sample) s2
  ON s1.id = s2.id
  (select Id, LAB_DATE as dtgdate, D_TG_1 from sample) s3
  ON s1.id = s3.id

Надеюсь, вы получите идеюэтот образец;если у вас есть другие типы образцов с их собственными датами, разбейте их из s1 и в их собственный подзапрос аналогичным образом (например, сделайте s4 для e_chol_1, s5 для k_hcr_1 и т. д.). Обратите внимание, что если какой-либо тип образца отсутствуетэто приведет к тому, что весь ряд исчезнет из результатов.Если это нежелательно и вы принимаете NULL для отсутствующих образцов, используйте LEFT JOIN вместо INNER

Если для пациента 01 будет несколько образцов, и вы хотите только самую последнюю, шаблон будет иметь вид:

select * from

  (select Id, LAB_DATE,A_CRE_1, B_GLUH_1,C_LDL_1,E_CHOL_1,F_HDL_1,H_HBA1C_1,K_HCR_1,
   row_number() over(partition by id order by lab_date desc) rn
   from sample) s1
  INNER JOIN
  (select Id, LAB_DATE as glu120date, I_GLU120_1,
   row_number() over(partition by id order by lab_date desc) rn
   from sample) s2
  ON s1.id = s2.id and s1.rn = s2.rn
WHERE
  s1.rn = 1 

Обратите внимание на добавление row_number() over(partition by id order by lab_date desc) rn - это устанавливает счетчик приращений в порядке убывания даты (последняя запись = 1, старше = 2 ...), который перезапускается с 1 для каждого другого идентификатора.Мы тоже присоединяемся и говорим, где rn = 1, чтобы выбрать только самые последние записи для каждого типа выборки

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...