【问题标题】:SQL Server : query to get multiple results in one fieldSQL Server:查询以在一个字段中获取多个结果
【发布时间】:2014-01-13 15:06:33
【问题描述】:

我有 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 语法以及“下一个”检查或检查(如果到期日期相同)和到期日期。

可能会出现在同一个到期日期有多个检查的情况,因此在这种情况下,必须将其连接起来并显示在一个字段中(例如:“校准、维护”)

这个查询的结果应该是这样的:

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

【问题讨论】:

  • 加入两个表。搜索谷歌关于加入和阅读。你可以解决你的问题。
  • 为什么Check insp_name 没有包含在您的结果表中?
  • 因为“检查”的due_date 不是最早/下一个到期日。 equip_id = 1最早的due_date是10/01/2014
  • @Shiva 所以你需要最早的due_date 为每个equip_id 和不同的insp_name 在这个due_date 的CSV 列表中?
  • 是的,看起来这就是OP 想要的。我构建了架构并填充了表格。这是小提琴,如果你想解决它并完成这个练习:) sqlfiddle.com/#!3/4fdff/2

标签: sql-server sql-server-2008 tsql syntax jointable


【解决方案1】:

使用@Shiva的SqlFiddle:

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

这是输出:

Here 是完整的工作示例。

【讨论】:

    【解决方案2】:
    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
    

    【讨论】:

      猜你喜欢
      • 2011-01-21
      • 2018-06-08
      • 1970-01-01
      • 2023-03-11
      • 1970-01-01
      • 2020-10-19
      • 2016-11-14
      • 1970-01-01
      • 2015-10-23
      相关资源
      最近更新 更多