根据计数在SQL中分配记录

时间:2016-04-13 07:47:56

标签: sql-server-2008

我要求将记录平均分配到两个类别。但如果我没有任何一个类别的记录,我应该计算其他类别的剩余记录。

示例数据:

enter image description here

如果这样的科目s1的学生是12,而科目s2是20.我需要挑选30名学生,结果应该给我15个每个科目,但是因为s1总共只有12,我应该从s1获得12 18来自s2。

1 个答案:

答案 0 :(得分:0)

这应该可以解决问题:

DECLARE @t TABLE(ID INT, Student VARCHAR(10), Subject CHAR(2))

INSERT INTO @t VALUES
(1, 'Stud1', 's1'),
(2, 'Stud2', 's1'),
(3, 'Stud3', 's2'),
(4, 'Stud4', 's2'),
(5, 'Stud5', 's2'),
(6, 'Stud6', 's2'),
(7, 'Stud7', 's2'),
(8, 'Stud8', 's2'),
(9, 'Stud9', 's2')


;WITH cte AS(SELECT *, ROW_NUMBER() OVER(PARTITION BY Subject ORDER BY ID) AS rn FROM @t)
SELECT TOP 7 * 
FROM cte
ORDER BY rn, Subject

这个想法是你在主题中对行进行编号,如:

1   Stud1   s1  1
3   Stud3   s2  1
2   Stud2   s1  2
4   Stud4   s2  2
5   Stud5   s2  3
6   Stud6   s2  4
7   Stud7   s2  5
8   Stud8   s2  6
9   Stud9   s2  7

因此,在选择top N行时,由于该列的排序,它们会自动分发。