Sql 编写CTE查询时,记录重复且顺序错误
我有一个表,表中的数据是按行排列的,数据需要按列汇总。目前,数据确实以列形式存在,但数据重复且顺序错误。此外,当我输入多个服务器名称时,我将获得“服务器1”列,其中“信息服务器2”列将为空,而“服务器3”列将包含数据 我已经看过stackoverflow、social.msdn.microsoft.com、sqlservercentral.com和sqlshack.com上的答案Sql 编写CTE查询时,记录重复且顺序错误,sql,sql-server,sql-server-2008,Sql,Sql Server,Sql Server 2008,我有一个表,表中的数据是按行排列的,数据需要按列汇总。目前,数据确实以列形式存在,但数据重复且顺序错误。此外,当我输入多个服务器名称时,我将获得“服务器1”列,其中“信息服务器2”列将为空,而“服务器3”列将包含数据 我已经看过stackoverflow、social.msdn.microsoft.com、sqlservercentral.com和sqlshack.com上的答案 WITH cte (Captivate_Id, Building_Name ,Server_Name,Server
WITH
cte (Captivate_Id, Building_Name ,Server_Name,Server_Number)
as
(
SELECT b.[Captivate_Id], b.[Building_Name] as Building_Name
,(s.Server_Name) as Server_Name
,ROW_NUMBER() OVER(ORDER BY s.Server_Name DESC) AS Server_Number
FROM [CAP-CORPCRM02].[CAP_ProductionED].dbo.server s
join [CAP-CORPCRM02].[CAP_ProductionED].dbo.building b on
s.building_id = b.building_id
WHERE s.Server_Name IS NULL
UNION ALL
SELECT b.[Captivate_Id], b.[Building_Name] as Building_Name
,(s.Server_Name) as Server_Name
,ROW_NUMBER() OVER(ORDER BY s.Server_Name DESC) AS Server_Number
FROM [CAP-CORPCRM02].[CAP_ProductionED].dbo.server s
join [CAP-CORPCRM02].[CAP_ProductionED].dbo.building b on
s.building_id = b.building_id
AND b.Captivate_Id IN
(
'FFF1234'
)
)
SELECT Captivate_ID as ID,Building_Name as Building_Name,
(SELECT Server_Name FROM CTE ct WHERE ct.Building_Name=cte.Building_Name
AND ct.Server_Number=1) Server1, -----, -- works but order wrong
(SELECT Server_Name FROM CTE ct WHERE ct.Building_Name=cte.Building_Name
AND ct.Server_Number=2) Server2, -- works but order wrong
(SELECT Server_Name FROM CTE ct WHERE ct.Building_Name=cte.Building_Name
AND ct.Server_Number=3) Server3
FROM cte
输出
ID Building_Name Server1 Server2 Server3
FFF1234 some name servername1 servername2 NULL
FFF1234 some name servername1 servername2 NULL
我希望输出是
ID Building_Name Server1 Server2 Server3
FFF1234 some name servername1 servername2 blank
您对行数的工作方式有误解。使用两个不同的行号命令,您有两个单独的行号序列。您可以通过如下方式更改CTE来纠正问题:
WITH cte1 (Captivate_Id, Building_Name ,Server_Name)
AS (
SELECT b.[Captivate_Id], b.[Building_Name] as Building_Name
,'' as Server_Name -- If you want a blank servername, make it so
FROM [CAP-CORPCRM02].[CAP_ProductionED].dbo.server s
join [CAP-CORPCRM02].[CAP_ProductionED].dbo.building b
on s.building_id = b.building_id
WHERE s.Server_Name IS NULL
UNION ALL
SELECT b.[Captivate_Id], b.[Building_Name] as Building_Name
,(s.Server_Name) as Server_Name
FROM [CAP-CORPCRM02].[CAP_ProductionED].dbo.server s
join [CAP-CORPCRM02].[CAP_ProductionED].dbo.building b
on s.building_id = b.building_id
AND b.Captivate_Id IN (
'FFF1234'
)
),
cte (Captivate_Id, Building_Name ,Server_Name, Server_Number)
as (
SELECT Captivate_ID,
Building_Name,
Server_Name,
ROW_NUMBER() OVER(ORDER BY s.Server_Name DESC) AS Server_Number
FROM cte1
)
SELECT Captivate_ID as ID,Building_Name as Building_Name,
(SELECT Server_Name FROM CTE ct WHERE ct.Building_Name=cte.Building_Name AND ct.Server_Number=1) Server1,-----, -- works but order wrong
(SELECT Server_Name FROM CTE ct WHERE ct.Building_Name=cte.Building_Name AND ct.Server_Number=2) Server2, -- works but order wrong
(SELECT Server_Name FROM CTE ct WHERE ct.Building_Name=cte.Building_Name AND ct.Server_Number=3) Server3
FROM cte
扰流板-原始错误代码
与
cte Captivate\u Id、建筑物名称、服务器名称、服务器编号
像
选择Captivate_ID,
楼名,
服务器名称,
按s.Server\U Name DESC AS Server\U NUMBER超额订购的行号
从…起
选择b.[Captivate\u Id],b.[Building\u Name]作为建筑名称
,作为服务器名称-如果您想要一个空的服务器名称,请这样做
-,按s.Server\U Name描述为Server\U NUMBER排序的行号
来自[CAP-CORPCRM02]。[CAP_生产].dbo.s服务器
加入[CAP-CORPCRM02]。[CAP_已生产].dbo.b栋
在s.building_id=b.building_id上
其中s.Server_Name为空
联合所有
选择b.[Captivate\u Id],b.[Building\u Name]作为建筑名称
,s.Server\u Name作为服务器名称
-,按s.Server\U Name描述为Server\U NUMBER排序的行号
来自[CAP-CORPCRM02]。[CAP_生产].dbo.s服务器
加入[CAP-CORPCRM02]。[CAP_已生产].dbo.b栋
在s.building_id=b.building_id上
和b.在
“FFF1234”
请编辑您的问题,并提供示例数据和期望的结果。示例数据和期望的结果在这里非常有用。另外,作为一个FYI,2008有大约6个星期的支持,所以你可能想考虑看升级路径很快。你的查询没有订单,所以任何命令是正确的。您需要使用ORDER BY来强制执行行的顺序。您是对的,我确实有一个误解。谢谢你把它清理干净。我得到一个错误消息102,级别15,状态1,第26行,附近语法不正确。看起来我的括号数是对的,还能是什么?噢,糟了。看起来CTE不喜欢嵌套的SELECT语句。编辑以上内容以提供更正的代码:当查看带有cte的代码时,cte带下划线,并表示无法识别为表hintAlso Captivate_Id、建筑物名称、服务器名称、服务器编号为选择Captivate_Id、建筑物名称、服务器名称,是否所有select值都带下划线,表示列名无效,第一行带下划线,表示语法不正确,应为表1-名称:Building Building_id varchar50,Building_名称varchar50,Cap_id varchar50表2-名称:Server Building_id varchar50,Server_名称varchar50