我在SQL Server中构建了一些表和查询,但现在我不知道如何让它们在这个最新的任务中协同工作。 有一张桌子,我们称之为ServerAssessment。它有一个服务器清单,例如它们的名称和服务器版,它们是Developer,Production,Unknown等。有一个更大的表名为DatabaseDetails,其中包含数千条关于ID的记录。每行都有一个服务器名称,一个用户名和此处不需要的其他详细信息。 我遇到的困难是我需要生成一个只列出开发人员服务器(WHERE Server Edition ='Developer')的查询,然后跟进并列出其后的每个不同的用户名(来自DatabaseDetails)。 从SQL逻辑的角度来看,我不确定这是如何最好地完成的。我觉得它看起来像这样吗?或者我是从错误的角度完全来到这里的?
ServerA001 User00001 User00002 User00003 User00111
ServerA015 User00001 User00002 User60005 User29031 User11111
ServerC037 User00001 User00009
ServerD066 User00001 User00002 User00003 User12312 User12333, User14141
ServerN123 User00001 User00003 User00009
同样,用户可以访问许多服务器。应该不是通过不同的服务器列出所有内容,而是将所有内容转换为不同的/唯一的用户,然后列出服务器?在专业氛围中,人们会更理想吗?
我现在所有的东西都是短暂而甜蜜的,加入表格并确保只返回Developer。
SELECT
DISTINCT [Server Name]
, [Server Edition]
FROM [ServerAssessment] AS tabDI
FULL JOIN [DatabaseDetails] AS tabUD
ON tabDI.[Server Name] = tabUD.[Server Name]
WHERE [SQL Server Edition] = 'Developer'
ORDER BY [Computer Name] ASC
PS:这些最初是Excel中的表格,但我将其导入SQL Server,因为在过去的几个月里,我对SQL的工作感觉更舒服。
答案 0 :(得分:0)
首先,使用完全连接将为您提供与开发人员服务器不直接相关的详细信息的记录。您希望使用左连接来获取所有开发服务器,但只获取与它们相关的详细信息。
其次,如果要在SQL中执行此操作,则必须查找如何执行动态sql pivot。创建报告时会出现问题,因为列数会发生变化。我建议你使用一个可以为你自动转动的报告工具。我使用SSRS /
做了类似的事情答案 1 :(得分:0)
我会使用ROW_NUMBER函数来处理PIVOT运算符:
SELECT *
FROM (
SELECT /*DISTINCT*/ tabDI.[ServerName], [UserName],
ColNum = ROW_NUMBER() OVER(PARTITION BY tabDI.[ServerName] ORDER BY [UserName])
FROM (VALUES
('ServerA001', 'Developer'),
('ServerA002', 'Enterprise'),
('ServerA015', 'Developer')
) AS tabDI ([ServerName], [SQL Server Edition]) -- [ServerAssessment]
LEFT JOIN (VALUES -- LEFT JOIN for servers without users
('ServerA001', 'User00001'),
('ServerA001', 'User00002'),
('ServerA001', 'User00003'),
('ServerA001', 'User00006'),
('ServerA002', 'User00001'),
('ServerA015', 'User00003'),
('ServerA015', 'User00004')
) AS tabUD ([ServerName], [UserName]) -- [DatabaseDetails]
ON tabDI.[ServerName] = tabUD.[ServerName]
WHERE [SQL Server Edition] = 'Developer'
) x
PIVOT ( MAX(x.UserName) FOR x.ColNum IN ([1], [2], [3], [4] /*, ...*/) ) y
ORDER BY y.[ServerName]
注意:此解决方案适用于数量有限的用户(在上述情况下为4)。