Sql 编写CTE查询时,记录重复且顺序错误

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

我有一个表,表中的数据是按行排列的,数据需要按列汇总。目前,数据确实以列形式存在,但数据重复且顺序错误。此外,当我输入多个服务器名称时,我将获得“服务器1”列,其中“信息服务器2”列将为空,而“服务器3”列将包含数据

我已经看过stackoverflow、social.msdn.microsoft.com、sqlservercentral.com和sqlshack.com上的答案

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