根据条件分组

时间:2018-06-27 00:33:49

标签: sql sql-server

我正在努力根据需要设置记录。

TRXCODE为8202的行包含记录集任何其他行的10%TRAMT。

所以我要对TRXCODE 8202行进行分组,并在8202行中设置10%的特定行。

下面的图片会更好地解释您。

enter image description here

创建表#TempRecords      (CODE VARCHAR(20),        TRDATE DATETIME,        行程情报,        TRREF VARCHAR(20),        TRXCODE INT,        TRAMT十进制(8,2)
     );

GO
INSERT INTO #TempRecords
 VALUES ('ABMSC31', '2003-01-21', 6957, 'SD21010304', 1753, 31.20),
        ('ABMSC31', '2003-01-21', 6957, 'SD21010304', 8202, 3.12),
        ('ABMSC31', '2003-01-21', 6957, 'SD21010304', 8104, 589.68),
        ('ABMSC31', '2003-01-30', 7024, '0000056246', 8104, -31.20),
        ('ABMSC31', '2003-01-30', 7024, '0000056246', 1753, -589.68),
        ('ABMSC31', '2003-01-30', 7024, '0000056246', 8202, -3.12),
        ('ABMSC31', '2003-01-30', 7024, '0000056246', 8104, 554.60),
        ('ABMSC31', '2003-01-30', 7024, '0000056246', 1753, 32.18),
        ('ABMSC31', '2003-01-30', 7024, '0000056246', 8202, 3.22),
        ('ABMSC31', '2003-03-07', 7301, '0000057577', 1001, 1250.00),
        ('ABMSC31', '2003-03-07', 7301, '0000057577', 1001, 1250.00),
        ('ABMSC31', '2003-03-07', 7301, '0000057577', 1001, 1250.00),
        ('ABMSC31', '2003-09-25', 8737, '0000060259', 1701, 1104.00)

2 个答案:

答案 0 :(得分:1)

使用cross joindense_rank获取组ID

with CTE as (
    select * from #TempRecords
    where trxcode = 8202
)
select T2.*,dense_rank () over (order by T1.TRAMT) GroupId 
from cte T1,(
    select * from #TempRecords
    where trxcode <> 8202   
) T2
where ROUND(T1.TRAMT/T2.TRAMT,1) = 0.1
union all
select *,dense_rank () over (order by TRAMT) GroupId from CTE

结果:

CODE                 TRTYPE               TRDATE                  TRBATCH     TRREF                TRXCODE     TRAMT                                   GroupId
-------------------- -------------------- ----------------------- ----------- -------------------- ----------- --------------------------------------- --------------------
ABMSC31              F                    2003-01-30 00:00:00.000 7024        0000056246           1753        32.18                                   2
ABMSC31              F                    2003-01-30 00:00:00.000 7024        0000056246           8104        -31.20                                  1
ABMSC31              F                    2003-01-30 00:00:00.000 7024        0000056246           8202        -3.12                                   1
ABMSC31              F                    2003-01-30 00:00:00.000 7024        0000056246           8202        3.22                                    2

Online Demo Link


  

请再说一遍,第2行和第3行也应该出现在2个单独的组中,因此,按照上图所示的总数应该是4组。

with CTE as (
    select * from #TempRecords
    where trxcode = 8202
)
, CTE2 as (
    select * from #TempRecords
    where trxcode <> 8202   
)
, CTE3 as (
    select T2.*,dense_rank () over (order by T1.TRAMT) GroupId 
    from cte T1,CTE2 T2
    where ROUND(T1.TRAMT/T2.TRAMT,1) = 0.1
)
,CTE4 as (
    select *,dense_rank () over (order by TRAMT) GroupId from CTE
)
select * from CTE3
union all
select * from CTE4
union all
select *,dense_rank () over (order by TRAMT) + (select max(GroupId) from CTE4)  GroupId  
from CTE2 where TRAMT not in (select TRAMT from CTE3)  

结果:

CODE                 TRTYPE               TRDATE                  TRBATCH     TRREF                TRXCODE     TRAMT                                   GroupId
-------------------- -------------------- ----------------------- ----------- -------------------- ----------- --------------------------------------- --------------------
ABMSC31              F                    2003-01-30 00:00:00.000 7024        0000056246           8104        -31.20                                  1
ABMSC31              F                    2003-01-30 00:00:00.000 7024        0000056246           1753        32.18                                   2
ABMSC31              F                    2003-01-30 00:00:00.000 7024        0000056246           8202        -3.12                                   1
ABMSC31              F                    2003-01-30 00:00:00.000 7024        0000056246           8202        3.22                                    2
ABMSC31              F                    2003-01-30 00:00:00.000 7024        0000056246           1753        -589.68                                 3
ABMSC31              F                    2003-01-30 00:00:00.000 7024        0000056246           8104        554.60                                  4

DEMO LINK

答案 1 :(得分:0)

这是一种方法,假设您拥有静态数据(和Oracle DB)是将静态数据用作输入表,然后与乘数表结合以扩展行。我认为这可以达到既定目标,但可能无法扩展到需要采用批处理方法的大型数据集。不过,您可能仍可以将此建议用作构建两阶段解决方案的入门工具,在该解决方案中,您首先将原始数据加载到#TempRecords中,然后使用带有乘法器的SELECT插入记录。

INSERT INTO TABLE #TempRecords (
    CODE, TRTYPE, TRDATE, TRBATCH, TRREF, TXCODE, TRAMT
)
SELECT data.CODE, data.TRTYPE, data.TRTYPE, data.TRDATE, data.TRBATCH
    , data.TRREF, data.TRXCODE, round(m.mult * data.TRAMT, 2)
FROM (
  SELECT 'ABMSC31' CODE, 'F' TRTYPE, '2003-01-30' TRDATE, 7024 TRBATCH
    , '0000056246' TRREF, 7024 TRXCODE, 32.18 TRAMT
  FROM dual
) data
JOIN (
    SELECT 1.0 mult
    FROM dual
    UNION ALL
    SELECT 0.1 mult
    FROM dual
) m
    ON 1=1

希望这会有所帮助。