且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

在 SQL Server 中声明的查询变量中创建新列

更新时间: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