我正在努力根据需要设置记录。
TRXCODE为8202的行包含记录集任何其他行的10%TRAMT。
所以我要对TRXCODE 8202行进行分组,并在8202行中设置10%的特定行。
下面的图片会更好地解释您。
创建表#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)
答案 0 :(得分:1)
使用cross join
和dense_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
请再说一遍,第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
答案 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
希望这会有所帮助。