并排打印结果 SQL 服务器

Print results side by side SQL Server

我有以下结果集,

现在有了上面的结果,我想通过 select 查询打印记录,如下图

请注意,我将在输出 Present Employee 和 Absent Employees 中只有两种类型的列。

我尝试使用 pivot tables,临时 table 但无法实现我想要的。

一种方法是 ROW_NUMBER 每个“状态”,然后使用 FULL OUTER JOIN 将 2 个数据集放入适当的列中。我使用 FULL OUTER JOIN,因为我 假设 您可能有不同数量的员工 present/absent。

CREATE TABLE dbo.YourTable (Name varchar(10), --Using a name that doesn't require delimit identification
                            Status varchar(7), --Using a name that doesn't require delimit identification
                            Days int);
GO

INSERT INTO dbo.YourTable(Name, Status, Days)
VALUES('Mal','Present',30),
      ('Jess','Present',20),
      ('Rick','Absent',30),
      ('Jerry','Absent',10);
GO

WITH RNs AS(
    SELECT Name,
           Status,
           Days,
           ROW_NUMBER() OVER (PARTITION BY Status ORDER BY Days DESC) AS RN
    FROM dbo.YourTable)
SELECT P.Name AS PresentName,
       P.Days AS PresentDays,
       A.Name AS AbsentName,
       A.Days AS AbsentDays
FROM (SELECT R.Name,
             R.Days,
             R.Status,
             R.RN
      FROM RNs R
      WHERE R.Status = 'Present') P
    FULL OUTER JOIN (SELECT R.Name,
                            R.Days,
                            R.Status,
                            R.RN
                     FROM RNs R
                     WHERE R.Status = 'Absent') A ON P.RN = A.RN;    


GO

DROP TABLE dbo.YourTable;

db<>fiddle

2 CTE 实际上更整洁:

WITH Absents AS(
    SELECT Name,
           Status,
           Days,
           ROW_NUMBER() OVER (ORDER BY Days DESC) AS RN
    FROM dbo.YourTable
    WHERE Status = 'Absent'),
Presents AS(
    SELECT Name,
           Status,
           Days,
           ROW_NUMBER() OVER (ORDER BY Days DESC) AS RN
    FROM dbo.YourTable
    WHERE Status = 'Present')
SELECT P.Name AS PresentName,
       P.Days AS PresentDays,
       A.Name AS AbsentName,
       A.Days AS AbsentDays
FROM Absents A
     FULL OUTER JOIN Presents P ON A.RN = P.RN;