组合多个数据库表并将行转换为列 - SQL Server

时间:2016-02-03 06:17:07

标签: sql sql-server

我有这3张桌子,我需要将它们组合在一起。

tblSites
| Site_Code | Site_Name |
     AA         AaaaaA
     BB         BaaaaB
     CC         CaaaaC

tblWeb
| WebID | AppName |    AppUrl    | ServerName | 
    1      aWeb     www.aWeb.com    ServerA
    2      bWeb     www.bWeb.com    ServerA
    3      cWeb     www.cWeb.com    ServerB
    4      dWeb     www.dWeb.com    ServerA
    5      eWeb     www.eWeb.com    ServerC
    6      fWeb     www.fWeb.com    ServerC
    7      gWeb     www.gWeb.com    ServerD
    8      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张桌子。我需要获得这种输出,我需要获得每个ServerName的相应Appname以及" LATEST"每个站点的摘要状态。 请。你可以帮我创建这个输出吗? 我很好,每个代码1个ServerName。

**Expected Output**
| ServerA |   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
   dWeb          OK        Critical      No Data Found     No Data Found

| ServerB |   Site-AA   |   Site-BB   |     Site-CC     |     Site-DD     |
   cWeb          OK        Critical      No Data Found     No Data Found

| ServerC |   Site-AA   |   Site-BB   |     Site-CC     |     Site-DD     |
   eWeb          OK        Critical      No Data Found     No Data Found
   fWeb          OK        Critical      No Data Found     No Data Found

| ServerD |   Site-AA   |   Site-BB   |     Site-CC     |     Site-DD     |
   gWeb       Critical        OK         No Data Found     No Data Found
   hWeb          OK        Critical      No Data Found     No Data Found

这是由专家之一创建的代码。

DECLARE @sql NVARCHAR(MAX)
SET @sql = ''
SELECT @sql = 'SELECT tblWeb.AppName ' + CHAR(10)
SELECT @sql = @sql + '   , ISNULL(MAX(CASE WHEN Site_Code  = ''' + Site_Code  + '''THEN SummaryState END), ''No Data Found'') AS '  + QUOTENAME('Site-'+Site_Code) + CHAR(10)
FROM tblSites
ORDER BY Site_Code
SELECT @sql = @sql + 'FROM ( SELECT *, rn = ROW_NUMBER() OVER(PARTITION BY Site_Code , WebID ORDER BY Last_Check DESC) FROM tblWebServices ) t 
LEFT JOIN tblWeb ON t.WebID = tblWeb.WebID  
WHERE t.rn = 1 GROUP BY tblWeb.AppName ORDER BY tblWeb.AppName '
PRINT @sql
EXEC sp_executesql @sql

该代码的输出就像这样

| 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

我需要获得每个服务器的AppName,就像我在预期输出中显示的那样。

0 个答案:

没有答案