[英]SQL server count and Sum Query?
我有一个带有字段(QuestionID,QuestionMarks)的问题表,数据字段如下所示:
QuestionID QuestionMarks
1 1
2 4
5 1
9 1
12 2
这意味着目前问题表中有5个问题,总共9个标记,现在我的问题是我想知道4个问题和8个标记的组合是可能的,然后取出该组合(通常是“ x”个问题的组合的“ y”标记是可能的)?
我当时正在考虑使用CTE,但担心如果我有成千上万的问题,将需要很多时间来执行查询。
请提出一些有关如何获取数据的想法。 我正在使用SQL Server 2008版
这是一个开始 。 它的性能会很差:
declare @Qs table (QuestionID int not null, QuestionMarks int not null)
insert into @Qs (QuestionID,QuestionMarks) values
(1,1), (2,4), (5,1), (9,1), (12,2)
declare @TargetMarks int = 8
declare @TargetCount int = 4
;with Build as (
select QuestionID as MinID,QuestionID as MaxID,QuestionMarks as Total,1 as Cnt
,'/' + CONVERT(varchar(max),QuestionID) + '/' as QPath
from @Qs
union all
select MinID,q.QuestionID,Total+q.QuestionMarks,Cnt+1,QPath + CONVERT(varchar(max),q.QuestionID) + '/'
from
Build b
inner join
@Qs q
on
b.MaxID < q.QuestionID and
b.Total + q.QuestionMarks <= @TargetMarks and
b.Cnt < @TargetCount
)
select * from Build where Cnt = @TargetCount and Total = @TargetMarks
结果集:
MinID MaxID Total Cnt QPath
--------------------------------------------------------------------------------
2 12 8 4 /2/5/9/12/
1 12 8 4 /1/2/9/12/
1 12 8 4 /1/2/5/12/
棘手的是,QPath值并不是存储ID值的最佳方法。
我认为您是对的,因为成千上万的问题可能会减慢执行速度,因此,我将首先限制要查询的潜在行。 您已经确定,即使具有数百万行,也不需要具有相同问号的多于四个的行,并且可以进一步减少该行,例如(抱歉,不知道SQL Server是否接受此语法)
WITH LimitPotentialRows AS
(SELECT m1.QuestionID, m1.QuestionMarks,
(SELECT SUM(m2.QuestionMarks)
FROM MyTable m2
WHERE m1.QuestionMarks = m2.QuestionMarks
AND m1.PrimaryKeyID <= m2.PrimaryKeyID) CurrentMarks,
(SELECT COUNT(*)
FROM MyTable m3
WHERE m1.QuestionMarks = m3.QuestionMarks
AND m1.PrimaryKeyID <= m3.PrimaryKeyID) TotalQuestions
FROM MyTable m1
WHERE m1.QuestionMarks <= :DesiredTotalQuestionMarks - :TotalNoOfQuestions + 1
HAVING CurrentMarks <= :DesiredTotalQuestionMarks
AND TotalQuestions <= :TotalNoOfQuestions)
希望有4个问题,总分8分,此CTE的结果将使您仅
QuestionMarks NumberOfQuestions
1 4
2 4
3 2
4 1
5 1
将行数从数万限制到最大12,您在进一步的计算中不太可能出现性能问题。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.