努力编写SQL来计算符合多个条件的记录。 我有3张桌子。 1是具有4列的“索赔”数据表。 2是带有3列的“规则”表。 3是一个具有5列的“条件”表。 索赔。source= rules.SystemType condtions.ruleid = rules.ru ...

问题描述 投票:0回答:1
我应该有

ruleId | claimsCount | systemType __________________________________ 1 | 1 | AAA 2 | 1 | AAA 3 | 4 | PPP 4 | 1 | AAA

我在ruleID:2包含2个条件的情况下遇到麻烦,并且必须匹配这两个条件,并且数量不高两次(如每个单独的条件匹配而言是数量的)。 任何规则都可以具有多个条件,但只能有一个条件。

这里是用于创建表和一些插入物的脚本。

CREATE TABLE [dbo].[Claim]( [claimId] [int] NOT NULL, [payerId] [nvarchar](50) NOT NULL, [CreatedDate] [datetime] NULL, [source] [nvarchar](3) NOT NULL ) ON [PRIMARY] GO ALTER TABLE [dbo].[Claim] ADD PRIMARY KEY CLUSTERED ( [claimId] ASC ) GO ALTER TABLE [dbo].[Claim] ADD DEFAULT (getdate()) FOR [CreatedDate] GO insert into claim values (101, '12345', GETDATE(),'AAA') insert into claim values (102, '54321', '2025-03-01 18:22:27.687','AAA') insert into claim values (103, '12345', GETDATE(),'PPP') insert into claim values (104, '54321', GETDATE(),'PPP') insert into claim values (105, '12345', '2025-03-01 18:22:27.687','PPP') insert into claim values (106, '55555', '2025-02-01 18:22:27.687','PPP') CREATE TABLE [dbo].[rules]( [ruleId] [int] NOT NULL, [systemType] [nvarchar](5) NOT NULL, [enabled] [varchar](1) NOT NULL ) ON [PRIMARY] GO ALTER TABLE [dbo].[rules] ADD PRIMARY KEY CLUSTERED ( [ruleId] ASC ) GO insert into rules values (1, 'AAA', 'Y') insert into rules values (2, 'AAA', 'Y') insert into rules values (3, 'PPP', 'Y') insert into rules values (4, 'AAA', 'Y') insert into rules values (5, 'PPP', 'Y') CREATE TABLE [dbo].[conditions]( [condId] [int] NOT NULL, [ruleId] [int] NULL, [conditionalType] [nvarchar](25) NOT NULL, [conditionalOperator] [nvarchar](25) NOT NULL, [conditionalValue] [nvarchar](25) NOT NULL ) ON [PRIMARY] GO ALTER TABLE [dbo].[conditions] ADD PRIMARY KEY CLUSTERED ( [condId] ASC ) GO insert into conditions values (1, 1, 'payerId', 'equals', '12345') insert into conditions values (2, 2, 'payerId', 'equals', '54321') insert into conditions values (3, 2, 'createdDate', 'greater_than_or_equal', '2025-03-01') insert into conditions values (4, 3, 'payerId', 'equals', '54321') insert into conditions values (5, 4, 'createdDate', 'equals', '2025-03-06') insert into conditions values (6, 5, 'createdDate', 'equals', '2025-02-01')

我正在将MS SQL Server开发人员与Management Studio一起使用。 我还附加了Visual Studio代码,并尝试使用副副词来帮助。 我已经使用了此SQL的多次迭代,但没有提出解决方案...

select rul.ruleId, count(clm.claimId) as 'claimCount', --clm.claimId, rul.systemType from claim clm inner join rules rul on clm.source = rul.systemType inner join conditions con on rul.ruleId = con.ruleId AND ( (con.conditionalType = 'payerId' AND con.conditionalValue = clm.payerId) OR ( (con.conditionalType = 'createdDate' AND con.conditionalOperator = 'equals' AND CONVERT(VARCHAR(10), con.conditionalValue, 101) = CONVERT(VARCHAR(10), clm.CreatedDate, 101)) OR (con.conditionalType = 'createdDate' AND con.conditionalOperator = 'greater_than_or_equal' AND CONVERT(VARCHAR(10), con.conditionalValue, 101) >= CONVERT(VARCHAR(10), clm.CreatedDate, 101)) OR (con.conditionalType = 'createdDate' AND con.conditionalOperator = 'less_than_or_equal' AND CONVERT(VARCHAR(10), con.conditionalValue, 101) <= CONVERT(VARCHAR(10), clm.CreatedDate, 101)) ) ) where rul.enabled = 'Y' group by rul.ruleId, rul.systemType--, clm.claimId order by rul.ruleId;

我感谢任何指导。 我很难将自己的头缠绕着。
	

我们需要确保索赔仅将规则符合规则,如果该规则满足所有规则的条件

。在您的

ruleId = 2

中,有两个条件,索赔必须满足
tho,才能算作匹配项。我们还想确保在每个条件下都不会对其进行两次计数,但是每次匹配

我们将:

join

claims

sql sql-server
1个回答
0
投票

conditions

在索赔上评估每个条件。

组通过索赔和规则,以检查每个规则的规则有多少条件以及索赔所满足的数量。

仅计算满足条件数量等于规则总数的索赔。

    这里是一个可以给您正确计数的查询:
  1. WITH condition_checks AS ( SELECT c.claimId, r.ruleId, r.systemType, cond.condId, cond.conditionalType, cond.conditionalOperator, cond.conditionalValue, CASE WHEN cond.conditionalType = 'payerId' AND cond.conditionalOperator = 'equals' AND c.payerId = cond.conditionalValue THEN 1 WHEN cond.conditionalType = 'createdDate' AND cond.conditionalOperator = 'equals' AND CONVERT(date, c.CreatedDate) = CONVERT(date, cond.conditionalValue) THEN 1 WHEN cond.conditionalType = 'createdDate' AND cond.conditionalOperator = 'greater_than_or_equal' AND CONVERT(date, c.CreatedDate) >= CONVERT(date, cond.conditionalValue) THEN 1 ELSE 0 END AS is_condition_met FROM claim c JOIN rules r ON c.source = r.systemType AND r.enabled = 'Y' JOIN conditions cond ON r.ruleId = cond.ruleId ), matched_claims AS ( SELECT claimId, ruleId, systemType, COUNT(*) AS total_conditions, SUM(is_condition_met) AS conditions_met FROM condition_checks GROUP BY claimId, ruleId, systemType ) SELECT ruleId, COUNT(DISTINCT claimId) AS claimsCount, systemType FROM matched_claims WHERE total_conditions = conditions_met GROUP BY ruleId, systemType ORDER BY ruleId

    	
最新问题
© www.soinside.com 2019 - 2025. All rights reserved.