通过重置列索引来合并行

问题描述 投票:0回答:1

我有以下疑问:

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 语句,但我必须有更好的选择。

sql sql-server t-sql
1个回答
0
投票

您可以通过取消数据透视(此处也称为标准化)、为您的排序分配适当的行号,然后重新透视它来实现此目的。看起来像这样:


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;
© www.soinside.com 2019 - 2024. All rights reserved.