简体   繁体   English

根据分组划分计数

[英]Split count based on group by

Need help to create split rows based group by count & if count more than 1000, example below 需要帮助以分组为单位创建拆分行,如果计数超过1000,请参见以下示例

Table 1 (Some sequential data with unique Id) 表1(一些具有唯一ID的顺序数据)

AID Batchid Status
1   PWB   0
1   PWB   0
1   PWB   0
1   PWB   0
2   PWB   0
2   PWB   0
2   PWB   0


CREATE TABLE #Tmp(
AID VARCHAR(5),
Tnt FLOAT,
BatchId VARCHAR(20),
status INT)
INSERT INTO #Tmp
SELECT  distinct AID, count(*),'PWB',0  FROM table1 WITH(NOLOCK) 
GROUP BY AID
SELECT * FROM #Tmp
DROP TABLE #Tmp

Above Query Output is 以上查询输出为

AID Tnt BatchId status
0   20    PWB   0
1   1     PWB   0
42  5010  PWB   0
11  2     PWB   0

But I want & first column will be unique to split the rows 但我想&第一列将是唯一的拆分行

AID Tnt BatchId status
0   20    PWB   0
1   1     PWB   0
42  1000  PWB   0
42  1000  PWB   0
42  1000  PWB   0
42  1000  PWB   0
42  1000  PWB   0
42  10    PWB   0
11  2     PWB   0

CROSS APPLY tally table. 交叉应用理货表格。 I use sys.all_objects as a tally. 我使用sys.all_objects作为理货。 Note Tnt must be int , no reason to declare count(*) as float . 注意Tnt必须是int ,没有理由将count(*)声明为float

CREATE TABLE #Tmp(
  AID VARCHAR(5),
  Tnt Int,
  BatchId VARCHAR(20),
  status INT);

-- your sample data
INSERT INTO #Tmp
VALUES
 (0  ,20   ,'PWB',0)
,(1  ,1    ,'PWB',0)
,(42 ,5010 ,'PWB',0)
,(11 ,2    ,'PWB',0);

--parameter
DECLARE @limit int = 1000;
SELECT AID, CASE WHEN rn*@limit <= Tnt THEN @limit ELSE Tnt%@limit END as Tnt, BatchId, status
FROM #Tmp t1
CROSS APPLY (
    SELECT TOP(Tnt/@limit + CASE Tnt%@limit WHEN 0 THEN 0 ELSE 1 END)
       rn = ROW_NUMBER() OVER(ORDER BY tnt)
    FROM sys.all_objects
) x;

DROP TABLE #tmp;

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM