[英]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.