SQL Server: запрос для получения нескольких результатов в одном поле


У меня есть 2 таблицы SQL Server

Equip_info

equip_id | asset_no
-------------------
1        | CAL-1 
2        | MIC-1
...

Equip_insp

insp_id | equip_id | insp_name   | due_date
----------------------------------------------
1       | 1        | Calibration | 2014-01-10
2       | 1        | Maintenance | 2014-01-10
3       | 1        | Check       | 2014-02-10
4       | 2        | Calibration | 2014-11-04
5       | 2        | Maintenance | 2014-05-04
...

equip_id не имеет 2 подобных insp_name, но это менее важно.

В одном предложении я хотел бы помочь мне с синтаксисом T-SQL для получения списка различных оборудований и с" следующей " проверкой или проверками (если due_date одинаковы) и due_date.

Это может быть случай, когда для одного и того же due_date существует несколько проверок, поэтому в этом случае случай этот должен быть объединен и показан в одном поле (например: "калибровка, техническое обслуживание")

Результат этого запроса должен быть примерно таким:

equip_id | asset_no | inspection               | due_date
-----------------------------------------------------------
1        | CAL-1    | Calibration, Maintenance | 2014-01-10
2        | MIC-1    | Maintenance              | 2014-05-04
2 2

2 ответа:

Используя SqlFiddle из @Shiva:

create table equip_info (
  equip_id int not null,
   asset_no nvarchar(10) not null
  );

insert into equip_info (equip_id, asset_no) values
(1, 'CAL-1'),
(2, 'MIC-1');

create table equip_insp (
  insp_id  int not null,
  equip_id  int not null,
  insp_name nvarchar(50) not null,
  due_date datetime not null
  );

insert into equip_insp values
(1,1,'Calibration','10/01/2014'),
(2,1,'Maintenance','10/01/2014'),
(3,1,'Check','10/02/2014'),
(4,2,'Calibration','04/11/2014'),
(5,2,'Maintenance','04/05/2014');

Вот что вам нужно:

;WITH DataSource AS
(
  select inf.equip_id
        ,asset_no
        ,MIN(due_date) as [due_date]
  from equip_info inf
  inner join equip_insp ins
    on inf.[equip_id] = ins.[equip_id]
  GROUP BY inf.equip_id
          ,asset_no
)
SELECT equip_id
      ,asset_no
      ,SUBSTRING((SELECT DISTINCT ', ' + insp_name 
        FROM equip_insp 
        WHERE due_date = DS.due_date
          AND equip_id = DS.equip_id
        FOR XML PATH('')
       ),2,4000) as inspection
      ,due_date
FROM DataSource DS

Это оупут:

Введите описание изображения здесь

Вот полный рабочий пример.

SELECT DISTINCT   Ins.equip_id
               ,  info.asset_no
               , STUFF(List.Inspections, 1 , 2, '') AS Inspections
               , ins.due_date 
FROM #equip_insp Ins INNER JOIN #equip_info Info
ON Ins.equip_id = info.equip_id CROSS APPLY 
                                    (
                                    SELECT ', ' + insp_name [text()]
                                    FROM #equip_insp
                                    WHERE equip_id = Ins.equip_id
                                    AND due_date = Ins.due_date
                                    FOR XML PATH('')
                                    ) List(Inspections)

Результаты

equip_id    asset_no    Inspections                     due_date
1           CAL-1       Calibration, Maintenance    2014-10-01 00:00:00.000
1           CAL-1       Check                       2014-10-02 00:00:00.000
2           MIC-1       Calibration                 2014-04-11 00:00:00.000
2           MIC-1       Maintenance                 2014-04-05 00:00:00.000