更新时间:2023-12-01 10:44:40
需要使用CTE
SET NOCOUNT ON;
DECLARE @colNo nvarchar(max)
DECLARE @SUMCols nvarchar(max)
DECLARE @query nvarchar(max)
SET NOCOUNT ON;
WITH vals AS (
SELECT DISTINCT ds.[No]
FROM QRTestView ds
)
SELECT @colNo = COALESCE(@colNo + ', ', '') + QUOTENAME([No]),
@SUMCols = COALESCE(@SUMCols + ', ', '') + 'SUM(' + QUOTENAME([No]) +')'
FROM vals
ORDER BY No
SELECT @query = N'
;WITH cte as (
SELECT *,
[Bonus] + 125 as [Fee],
([Bonus] + 125) * [ALL] as [Fee2]
FROM (
SELECT *,
CASE WHEN 70-(100 - Quote) * 10 > -80 THEN 70-(100 - Quote) * 10 ELSE -70 END as [Bonus]
FROM (
SELECT *,
'+REPLACE(@colNo,',','+')+' as [ALL]
FROM (
SELECT CAST(No as CHAR(12)) As No,
CAST(Quote as CHAR(7)) As Quote,
CAST(Quote as CHAR(7)) As Q
FROM QRTestView
WHERE Datum >= @from_val and Datum <= @to_val
) AS sel
PIVOT (
COUNT(Q)
FOR No IN ('+@colNo+')
) AS p
) AS d
) as ff
)
SELECT *
FROM (
SELECT *
FROM cte
UNION ALL
SELECT ''ALL'',
'+@SUMCols+'
SUM([ALL]),
NULL,
NULL,
SUM(Fee2)
FROM cte
) as t
ORDER BY CASE WHEN Quote = ''ALL'' THEN 101 ELSE CAST(Quote as INT) END DESC'
EXEC sp_executesql @query, N'@from_val datetime, @to_val datetime', @from_val = @from, @to_val = @to