При написании запроса CTE записи дублируются и расположены в неправильном порядке. - PullRequest
1 голос
/ 31 мая 2019

У меня есть таблица, в которой данные представлены в строках, а данные должны быть сведены в столбцы. В настоящее время данные идут в столбцах, но данные дублируются и расположены в неправильном порядке. Также, когда я введу более одного имени сервера, я получу столбец сервера 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

1 Ответ

2 голосов
/ 31 мая 2019

У вас неправильное представление о том, как работает ROW_NUMBER(). С двумя различными командами ROW_NUMBER() у вас есть две отдельные последовательности номеров строк. Вы можете исправить свою проблему, изменив свой 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

SPOILER - Оригинальный плохой код

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...