Sql 在操作员中使用时显示所有给定ID

Sql 在操作员中使用时显示所有给定ID,sql,sql-server,tsql,common-table-expression,Sql,Sql Server,Tsql,Common Table Expression,我有一个CTE,它根据给定的用户id和特定的日期范围水平显示每个用户id的记录(而不是通常的“列出”方式)。我正在努力寻找一种方法来显示给出的每一条记录,因为有时在这段时间内,该用户没有注册,但我仍然需要知道他是否注册。我可以手动检查,但有时我会得到超过200个id 这是我用当前代码得到的 id reg1 reg2 reg3 ----------------- x a b c 这就是我所期望的 id reg1 reg2 reg3 ----------------- x a

我有一个CTE,它根据给定的用户id和特定的日期范围水平显示每个用户id的记录(而不是通常的“列出”方式)。我正在努力寻找一种方法来显示给出的每一条记录,因为有时在这段时间内,该用户没有注册,但我仍然需要知道他是否注册。我可以手动检查,但有时我会得到超过200个id

这是我用当前代码得到的

id reg1 reg2 reg3
-----------------
x  a    b    c
这就是我所期望的

id reg1 reg2 reg3
-----------------
x  a    b    c
y  NULL NULL NULL -- 'y' doesn't exists, ergo, it should display the id and nulls on the rest of columns.
我的代码

;WITH CTE AS(
   SELECT PER_PRO, ID_HR, NOM_INC, rut_dv, dias_durAC, INI, FIN,
       ROW_NUMBER()OVER(PARTITION BY ID_HR ORDER BY ULT_ACT) AS RN
   FROM dbo.inf_lic WHERE PER_PRO = --GIVEN DATE PERIOD
)
SELECT ID_HR,rut_dv,NOM_INC,
       max(case when rn = 1 then DIAS_DURAC end) as DIAS_DUR1,
       max(case when rn = 1 then INI end) as INI1,
       max(case when rn = 1 then FIN end) as FIN1,

       max(case when rn = 2 then DIAS_DURAC end) as DIAS_DUR2,
       max(case when rn = 2 then INI end) as INI2,
       max(case when rn = 2 then FIN end) as FIN2,

       max(case when rn = 3 then DIAS_DURAC end) as DIAS_DUR3,
       max(case when rn = 3 then INI end) as INI3,
       max(case when rn = 3 then FIN end) as FIN3,

       max(case when rn = 4 then DIAS_DURAC end) as DIAS_DUR4,
       max(case when rn = 4 then INI end) as INI4,
       max(case when rn = 4 then FIN end) as FIN4
FROM CTE
WHERE RUT_DV in (/*GIVEN VALUES*/) 
GROUP BY ID_HR,RUT_DV, NOM_INC;
我建议使用“在期间”标志,该标志可以与
RN
组合使用:

WITH CTE AS(
      SELECT l.*,
             (CASE WHEN PER_PRO = ?
                   THEN ROW_NUMBER() OVER (PARTITION BY ID_HR ORDER BY ULT_ACT)
              END) as rn
      FROM dbo.inf_lic l
     )
SELECT ID_HR,rut_dv,NOM_INC,
       max(case when rn = 1 then DIAS_DURAC end) as DIAS_DUR1,
       max(case when rn = 1 then INI end) as INI1,
       max(case when rn = 1 then FIN end) as FIN1,

       max(case when rn = 2 then DIAS_DURAC end) as DIAS_DUR2,
       max(case when rn = 2 then INI end) as INI2,
       max(case when rn = 2 then FIN end) as FIN2,

       max(case when rn = 3 then DIAS_DURAC end) as DIAS_DUR3,
       max(case when rn = 3 then INI end) as INI3,
       max(case when rn = 3 then FIN end) as FIN3,

       max(case when rn = 4 then DIAS_DURAC end) as DIAS_DUR4,
       max(case when rn = 4 then INI end) as INI4,
       max(case when rn = 4 then FIN end) as FIN4
FROM CTE
WHERE RUT_DV in (/* GIVEN VALUES */) 
GROUP BY ID_HR, RUT_DV, NOM_INC;

为什么你需要使用IN子句呢?您的问题不清楚,因为您的示例数据和结果与代码中的列名不匹配。是的,我需要这些id的数据,特别是它们是否存在@taballeman将您可能拥有的id的整个列表放在一个视图中(它应该类似于从表中选择distinct(id)),然后将当前查询与该视图进行左外部联接