Sql server 如何在SQL Server中组合多个表并将行转换为列

Sql server 如何在SQL Server中组合多个表并将行转换为列,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。 请帮我做这个 你的评论和回答将大有帮助。
谢谢

如果您想在结果选择中显示Appname,请尝试此操作

DECLARE @sql NVARCHAR(MAX)
SET @sql = ''
SELECT @sql = 'SELECT t.webid, tw.appname ' + 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 INNER JOIN tblweb tw on t.webid = tw.webid WHERE rn = 1 GROUP BY t.WebID, tw.appname ORDER BY t.WebID '
PRINT @sql
EXEC sp_executesql @sql
如果不需要webid,请将其从第三行的选择中删除

  SELECT @sql = 'SELECT tw.appname ' + CHAR(10)
你很接近解决方案


如果您希望在结果选择中显示Appname,请尝试此操作

DECLARE @sql NVARCHAR(MAX)
SET @sql = ''
SELECT @sql = 'SELECT t.webid, tw.appname ' + 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 INNER JOIN tblweb tw on t.webid = tw.webid WHERE rn = 1 GROUP BY t.WebID, tw.appname ORDER BY t.WebID '
PRINT @sql
EXEC sp_executesql @sql
如果不需要webid,请将其从第三行的选择中删除

  SELECT @sql = 'SELECT tw.appname ' + CHAR(10)
你很接近解决方案


希望这有助于了解TBLSite与其他表之间的关系。您需要一系列连接和一个枢轴。你试过什么了吗?你至少能告诉我们如何把桌子连接在一起吗?@StanislovasKalašnikovas the tblsite。是|站点AA |站点BB |站点CC |站点DD |我需要将站点作为最新摘要的列state@TimBiegeleisen我已经输入了我配置的代码。提前感谢TBLSite如何与其他表相关?您需要一系列连接和一个透视。你试过什么了吗?你至少能告诉我们如何把桌子连接在一起吗?@StanislovasKalašnikovas the tblsite。是|站点AA |站点BB |站点CC |站点DD |我需要将站点作为最新摘要的列state@TimBiegeleisen我已经输入了我配置的代码。提前谢谢。我刚刚尝试了你的代码,但是在这行“SELECT@sql='SELECT t.webid,tw.appname'+CHAR(10)”中有一个错误,它说“附近的语法不正确”。你能帮我配置它吗。我还在研究那个密码。请复制您的查询并在select上添加行,可能是引号有问题,您仍然有问题吗?。我刚刚尝试了你的代码,但是在这行“SELECT@sql='SELECT t.webid,tw.appname'+CHAR(10)”中有一个错误,它说“附近的语法不正确”。你能帮我配置它吗。我还在研究那个密码。请复制您的查询并在select上添加行,引号可能有问题,您仍然有问题吗?