27,579
社区成员
发帖
与我相关
我的任务
分享
IF OBJECT_ID('TempDB..#t',N'U') IS NOT NULL
DROP TABLE #t
GO
CREATE TABLE #t(a varchar(50),b varchar(50),c varchar(50),amount int)
INSERT INTO #t
SELECT N'a1' AS [a], N'b1' AS [b], N'c1' AS [c], N'10' AS [amount] UNION ALL
SELECT N'a1' AS [a], N'b1' AS [b], N'c1' AS [c], N'40' AS [amount] UNION ALL
SELECT N'a1' AS [a], N'b1' AS [b], N'c1' AS [c], N'1' AS [amount] UNION ALL
SELECT N'a1' AS [a], N'b1' AS [b], N'c1' AS [c], N'1' AS [amount] UNION ALL
SELECT N'a1' AS [a], N'b1' AS [b], N'c1' AS [c], N'1' AS [amount] UNION ALL
SELECT N'a1' AS [a], N'b1' AS [b], N'c1' AS [c], N'1' AS [amount] UNION ALL
SELECT N'a1' AS [a], N'b1' AS [b], N'c1' AS [c], N'40' AS [amount] UNION ALL
SELECT N'a1' AS [a], N'b1' AS [b], N'c1' AS [c], N'10' AS [amount] UNION ALL
SELECT N'a1' AS [a], N'b1' AS [b], N'c1' AS [c], N'50' AS [amount] UNION ALL
SELECT N'a1' AS [a], N'b1' AS [b], N'c2' AS [c], N'30' AS [amount] UNION ALL
SELECT N'a1' AS [a], N'b1' AS [b], N'c2' AS [c], N'40' AS [amount] UNION ALL
SELECT N'a1' AS [a], N'b1' AS [b], N'c2' AS [c], N'10' AS [amount] UNION ALL
SELECT N'a1' AS [a], N'b1' AS [b], N'c2' AS [c], N'10' AS [amount] UNION ALL
SELECT N'a1' AS [a], N'b1' AS [b], N'c2' AS [c], N'30' AS [amount] UNION ALL
SELECT N'a1' AS [a], N'b1' AS [b], N'c2' AS [c], N'30' AS [amount] UNION ALL
SELECT N'a1' AS [a], N'b1' AS [b], N'c2' AS [c], N'70' AS [amount] UNION ALL
SELECT N'a1' AS [a], N'b1' AS [b], N'c2' AS [c], N'30' AS [amount]
go
WITH CTE AS(
SELECT
ROW_NUMBER()OVER(ORDER BY a,b,c)RN
,*
FROM
#t
)
,CTE2 AS(
SELECT a,b,c,amount,RN,1 head,1 item,amount sumamount FROM CTE WHERE RN=1
UNION ALL
SELECT
A.a,A.b,A.c,A.amount,A.RN
,CASE WHEN A.amount+B.sumamount<=60 AND B.item<4 THEN B.head ELSE B.head+1 END
,CASE WHEN A.amount+B.sumamount<=60 AND B.item<4 THEN B.item+1 ELSE 1 END
,CASE WHEN A.amount+B.sumamount<=60 AND B.item<4 THEN A.amount+B.sumamount ELSE A.amount END
FROM
CTE A
INNER JOIN CTE2 B ON A.RN=B.RN+1
)
SELECT head,item,a,b,c,amount FROM CTE2
WITH tmp_GridResults_1 (a,b,c,amount) AS (
SELECT N'a1',N'b1',N'c1',10 UNION ALL
SELECT N'a1',N'b1',N'c1',40 UNION ALL
SELECT N'a1',N'b1',N'c1',40 UNION ALL
SELECT N'a1',N'b1',N'c1',10 UNION ALL
SELECT N'a1',N'b1',N'c1',50 UNION ALL
SELECT N'a1',N'b1',N'c2',30 UNION ALL
SELECT N'a1',N'b1',N'c2',40 UNION ALL
SELECT N'a1',N'b1',N'c2',10 UNION ALL
SELECT N'a1',N'b1',N'c2',10 UNION ALL
SELECT N'a1',N'b1',N'c2',30 UNION ALL
SELECT N'a1',N'b1',N'c2',30 UNION ALL
SELECT N'a1',N'b1',N'c2',70 UNION ALL
SELECT N'a1',N'b1',N'c2',30
),
t1 AS (
SELECT *,
ROW_NUMBER() OVER (ORDER BY a,b,c) id
FROM tmp_GridResults_1
),
t2 AS (
SELECT *,
1 head,
1 item,
amount groupAmount
FROM t1
WHERE id = 1
UNION ALL
SELECT t1.*,
t2.head,
t2.item+1,
t2.groupAmount + t1.amount
FROM t1
JOIN t2
ON t1.id = t2.id+1
WHERE t1.a = t2.a
AND t1.b = t2.b
AND t1.c = t2.c
AND t2.item < 4
AND (t2.groupAmount + t1.amount) <= 60
UNION ALL
SELECT t1.*,
t2.head+1,
1,
t1.amount
FROM t1
JOIN t2
ON t1.id = t2.id+1
WHERE t1.a <> t2.a
OR t1.b <> t2.b
OR t1.c <> t2.c
OR t2.item >= 4
OR (t2.groupAmount + t1.amount) > 60
)
SELECT head, item, a, b, c, amount
FROM t2
ORDER BY head, item
head item a b c amount
----------- ----------- ---- ---- ---- -----------
1 1 a1 b1 c1 40
2 1 a1 b1 c1 40
2 2 a1 b1 c1 10
3 1 a1 b1 c1 50
3 2 a1 b1 c1 10
4 1 a1 b1 c2 30
5 1 a1 b1 c2 40
5 2 a1 b1 c2 10
5 3 a1 b1 c2 10
6 1 a1 b1 c2 30
6 2 a1 b1 c2 30
7 1 a1 b1 c2 70
8 1 a1 b1 c2 30
IF OBJECT_ID('TempDB..#t',N'U') IS NOT NULL
DROP TABLE #t
GO
CREATE TABLE #t(a varchar(50),b varchar(50),c varchar(50),amount int)
INSERT INTO #t
SELECT N'a1' AS [a], N'b1' AS [b], N'c1' AS [c], N'10' AS [amount] UNION ALL
SELECT N'a1' AS [a], N'b1' AS [b], N'c1' AS [c], N'40' AS [amount] UNION ALL
SELECT N'a1' AS [a], N'b1' AS [b], N'c1' AS [c], N'40' AS [amount] UNION ALL
SELECT N'a1' AS [a], N'b1' AS [b], N'c1' AS [c], N'10' AS [amount] UNION ALL
SELECT N'a1' AS [a], N'b1' AS [b], N'c1' AS [c], N'50' AS [amount] UNION ALL
SELECT N'a1' AS [a], N'b1' AS [b], N'c2' AS [c], N'30' AS [amount] UNION ALL
SELECT N'a1' AS [a], N'b1' AS [b], N'c2' AS [c], N'40' AS [amount] UNION ALL
SELECT N'a1' AS [a], N'b1' AS [b], N'c2' AS [c], N'10' AS [amount] UNION ALL
SELECT N'a1' AS [a], N'b1' AS [b], N'c2' AS [c], N'10' AS [amount] UNION ALL
SELECT N'a1' AS [a], N'b1' AS [b], N'c2' AS [c], N'30' AS [amount] UNION ALL
SELECT N'a1' AS [a], N'b1' AS [b], N'c2' AS [c], N'30' AS [amount] UNION ALL
SELECT N'a1' AS [a], N'b1' AS [b], N'c2' AS [c], N'70' AS [amount] UNION ALL
SELECT N'a1' AS [a], N'b1' AS [b], N'c2' AS [c], N'30' AS [amount]
go
WITH CTE AS(
SELECT
ROW_NUMBER()OVER(ORDER BY GETDATE())RN
,*
FROM
#t
)
,CTE2 AS(
SELECT a,b,c,amount,RN,1 head,1 item,amount sumamount FROM CTE WHERE RN=1
UNION ALL
SELECT
A.a,A.b,A.c,A.amount,A.RN
,CASE WHEN A.amount+B.sumamount<=60 THEN B.head ELSE B.head+1 END
,CASE WHEN A.amount+B.sumamount<=60 THEN B.item+1 ELSE 1 END
,CASE WHEN A.amount+B.sumamount<=60 THEN A.amount+B.sumamount ELSE A.amount END
FROM
CTE A
INNER JOIN CTE2 B ON A.RN=B.RN+1
)
SELECT head,item,a,b,c,amount FROM CTE2