Sql server 如何在SQL Server中组合多个表并将行转换为列
我有这个3数据库表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
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上添加行,引号可能有问题,您仍然有问题吗?