Sql server 在SQL Server中组合3个表
我有这个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
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上