Sql server 在SQL Server中组合3个表

Sql server 在SQL Server中组合3个表,sql-server,Sql Server,我有这个3数据库表 tblSites | Sites | SiteName | AA AaaaaaaA BB BaaaaaaB CC CaaaaaaC DD DaaaaaaD tblWeb | WebID | AppName | AppUrl | ServerName | 1 aWeb www.aWeb.com ServerA 1 bWeb www.bWeb.com

我有这个3数据库表

tblSites
| Sites | SiteName |
   AA     AaaaaaaA
   BB     BaaaaaaB
   CC     CaaaaaaC
   DD     DaaaaaaD

tblWeb
| WebID | AppName |    AppUrl    | ServerName | 
    1      aWeb     www.aWeb.com    ServerA
    1      bWeb     www.bWeb.com    ServerA
    1      cWeb     www.cWeb.com    ServerB
    1      dWeb     www.dWeb.com    ServerA
    1      eWeb     www.eWeb.com    ServerC
    1      fWeb     www.fWeb.com    ServerC
    1      gWeb     www.gWeb.com    ServerD
    1      hWeb     www.hWeb.com    ServerD

tblWebServices
| Sites | WebID | SummaryState |       Last_Check       | 
    A       1         OK         02/01/2016 10:00:00.000
    A       1       Critical     02/01/2016 10:00:04.000
    A       2         OK         02/01/2016 10:00:04.000
    A       2       Critical     02/01/2016 10:00:06.000
    A       3         OK         02/01/2016 10:00:07.000
    A       3         OK         02/01/2016 10:00:09.000
    A       4         OK         02/01/2016 10:00:10.000
    A       4         OK         02/01/2016 10:00:12.000
    A       5       Critical     02/01/2016 10:00:14.000
    A       5         OK         02/01/2016 10:00:17.000
    A       6         OK         02/01/2016 10:00:20.000
    A       6         OK         02/01/2016 10:00:23.000
    A       7         OK         02/01/2016 10:00:25.000
    A       7       Critical     02/01/2016 10:00:36.000
    A       8         OK         02/01/2016 10:00:39.000
    A       8         OK         02/01/2016 10:00:40.000
    B       1       Critical     02/02/2016 10:00:00.000
    B       1         OK         02/02/2016 10:00:04.000
    B       2       Critical     02/02/2016 10:00:04.000
    B       2         OK         02/02/2016 10:00:06.000
    B       3       Critical     02/02/2016 10:00:07.000
    B       3       Critical     02/02/2016 10:00:09.000
    B       4       Critical     02/02/2016 10:00:10.000
    B       4       Critical     02/02/2016 10:00:12.000
    B       5         OK         02/02/2016 10:00:14.000
    B       5       Critical     02/02/2016 10:00:17.000
    B       6       Critical     02/02/2016 10:00:20.000
    B       6       Critical     02/02/2016 10:00:23.000
    B       7       Critical     02/02/2016 10:00:25.000
    B       7         OK         02/02/2016 10:00:36.000
    B       8       Critical     02/02/2016 10:00:39.000
    B       8       Critical     02/02/2016 10:00:40.000
这是3数据库表。 tblWeb.WebID=tblWebServices.WebID

我需要得到 应用tblWeb的名称,并将TBLSite的位置转换为列 站点下还应显示tblWebServices中Appname的“最新”摘要状态,所有没有数据的站点应标记为“未找到数据”

预期输出如下所示:

Expected Output:

| AppName |   Site-AA   |   Site-BB   |     Site-CC     |     Site-DD     |
   aWeb       Critical        OK         No Data Found     No Data Found
   bWeb       Critical        OK         No Data Found     No Data Found
   cWeb          OK        Critical      No Data Found     No Data Found
   dWeb          OK        Critical      No Data Found     No Data Found
   eWeb          OK        Critical      No Data Found     No Data Found
   fWeb          OK        Critical      No Data Found     No Data Found
   gWeb       Critical        OK         No Data Found     No Data Found
   hWeb          OK        Critical      No Data Found     No Data Found
这是我想要的输出。 我已经在这里搜索了所有的例子和问题,但对我来说似乎没有任何意义。 有人能帮我在SQL Server中配置一些关于此输出的代码吗

这是我在这个问题中配置的代码和一些答案

DECLARE @sql NVARCHAR(MAX)
SET @sql = ''
SELECT @sql = 'SELECT WebID ' + CHAR(10)
SELECT @sql = @sql + '   , ISNULL(MAX(CASE WHEN Sites  = ''' + Sites  + '''THEN summary_state END), ''No Data Found'') AS '  + QUOTENAME('Site-'+Sites) + CHAR(10)
FROM tblSites
ORDER BY Sites
SELECT @sql = @sql + 'FROM ( SELECT *, rn = ROW_NUMBER() OVER(PARTITION BY Sites , WebID ORDER BY Last_Check DESC) FROM tblWebServices ) t WHERE rn = 1 GROUP BY WebID ORDER BY WebID '
PRINT @sql
EXEC sp_executesql @sql
这个代码的输出是这样的

|  WebID  |   Site-AA   |   Site-BB   |     Site-CC     |     Site-DD     |
     1        Critical        OK         No Data Found     No Data Found
     2        Critical        OK         No Data Found     No Data Found
     3           OK        Critical      No Data Found     No Data Found
     4           OK        Critical      No Data Found     No Data Found
     5           OK        Critical      No Data Found     No Data Found
     6           OK        Critical      No Data Found     No Data Found
     7        Critical        OK         No Data Found     No Data Found
     8           OK        Critical      No Data Found     No Data Found
我不需要WebID在场。我需要AppName。 请帮我做这个 你的评论和回答将大有帮助。
谢谢

您想要的东西和您得到的东西之间的唯一区别似乎是您想要应用程序名,但是您得到了应用程序id,因此只需选择应用程序名而不是应用程序id

Select application_name, 
MAX(CASE WHEN site-code = 'MK' Then MaxRoundTrip else NULL end) as [summaryMK], 
MAX(CASE WHEN site-code = 'MK' and timestamp=MaxRoundTrip then [summary-state]  else NULL end) as [timestampMK], 
MAX(CASE WHEN site-code = 'MV' Then MaxRoundTrip else NULL end) as [summaryMV], 
MAX(CASE WHEN site-code = 'MV' and timestamp=MaxRoundTrip then [summary-state] else NULL end) as [timestampMV]
from (select *, MAX(timestamp) Over(Partition by web_apps_id, site-code) as maxroundtrip from tblServices) tblServices
group by application_name

您可以加入表并获取应用程序名称

Select 
Web.application_name
MAX(CASE WHEN site-code = 'MK' Then MaxRoundTrip else NULL end) as [summaryMK], 
MAX(CASE WHEN site-code = 'MK' and timestamp=MaxRoundTrip then [summary-state]  else NULL end) as [timestampMK], 
MAX(CASE WHEN site-code = 'MV' Then MaxRoundTrip else NULL end) as [summaryMV], 
MAX(CASE WHEN site-code = 'MV' and timestamp=MaxRoundTrip then [summary-state] else NULL end) as [timestampMV]
  from 
     (select 
         *, 
         MAX(timestamp) Over(Partition by web_apps_id, site-code)
as maxroundtrip 
   from tblServices) tblServices Service
left join tblWeb Web on Service.web_apps_id= Web.web_apps_id
group by web_apps_id

您是否有固定数量的
站点代码
否。没有固定数量的站点代码。可能有其他代码,它来自不同的表。这就是为什么我不能将应用程序名直接放在select上