我有一个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;
答案 0 :(得分:1)
我建议使用“定期”标志,该标志可以与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;