我有以下疑问:
select t.scode, c.dpercent0, c.dpercent1, c.dpercent2, c.dpercent3, c.DPERCENT4,c.dpercent5, c.dpercent6, c.dpercent7, c.dpercent8
from tenant t
join commschedule s on t.hmyperson=s.htenant
join camrule c on c.hschedule=s.hmy and c.htenant=t.hmyperson
where t.scode in ('t0000359','t0004019')
and s.hchargecode is null;
哪个输出: 例如,行:
scode DPERCENT0 dpercent1 dpercent2 dpercent3 DPERCENT4 dpercent5 dpercent6 dpercent7 dpercent8
t0004019 9 10 0 0 0 0 0 0 0
t0000359 8 10 11 0 0 0 0 0 0
t0000359 9 10 11 0 0 0 0 0 0
我想合并具有相同代码的行,如下所示:
t0004019 9 10 0 0 0 0 0 0 0
t0000359 8 10 11 9 10 11 0 0 0
因此,当 dpercent 列中出现 0 时,下一行将替换从 dpercent0 开始的值
到目前为止,我已经尝试过使用游标和 LAG/LEAD 函数的存储过程。我可以尝试多个 CASE 语句,但我必须有更好的选择。
您可以通过取消数据透视(此处也称为标准化)、为您的排序分配适当的行号,然后重新透视它来实现此目的。看起来像这样:
WITH CTE AS(
SELECT V.SCODE,
V.DTFROM,
V.DTTO,
UP.StepVal,
UP.StepNo,
ROW_NUMBER() OVER (ORDER BY CASE UP.StepVal WHEN 0 THEN 1 ELSE 0 END, V.SCODE, UP.StepNo) AS RN
FROM (VALUES(1, CONVERT(date,'2023-07-06'), CONVERT(date,'2024-01-01'), 1, 2, 3, 0, 0, 0, 0, 0),
(2, CONVERT(date,'2024-01-02'), CONVERT(date,'2025-01-01'), 4, 5, 6, 0, 0, 0, 0, 0))V(SCODE, DTFROM, DTTO, dStep0,dStep1,dStep2,dStep3,dStep4,dStep5,dStep6,dStep7)
CROSS APPLY (VALUES(dStep0,0),
(dStep1,1),
(dStep2,2),
(dStep3,3),
(dStep4,4),
(dStep5,5),
(dStep6,6),
(dStep7,7))UP(StepVal,StepNo))
SELECT MIN(CTE.SCODE) AS SCODE,
MIN(CTE.DTFROM) AS DTFROM,
MAX(CTE.DTTO) AS DTTO,
MAX(CASE RN WHEN 1 THEN CTE.StepVal END) AS Step0,
MAX(CASE RN WHEN 2 THEN CTE.StepVal END) AS Step1,
MAX(CASE RN WHEN 3 THEN CTE.StepVal END) AS Step2,
MAX(CASE RN WHEN 4 THEN CTE.StepVal END) AS Step3,
MAX(CASE RN WHEN 5 THEN CTE.StepVal END) AS Step4,
MAX(CASE RN WHEN 6 THEN CTE.StepVal END) AS Step5,
MAX(CASE RN WHEN 7 THEN CTE.StepVal END) AS Step6,
MAX(CASE RN WHEN 8 THEN CTE.StepVal END) AS Step7
FROM CTE;