在 SQL 服务器中定义动态 PIVOT sql 查询

Defining dynamic PIVOT sql query in SQL Server

目前我在 sql 服务器的存储过程中定义了一个静态数据透视表 sql 查询:

ALTER PROCEDURE [dbo].[MonthRepo] 
    -- Add the parameters for the stored procedure here
    @from datetime,
    @to datetime
AS
BEGIN
    DECLARE @cols nvarchar(12)
    DECLARE @query nvarchar(max)

    SET NOCOUNT ON;

    -- Insert statements for procedure here
    SELECT *
    FROM (
        SELECT ROUND(ds.ct_quot_rate,0) AS Quote,
               ROUND(ds.ct_quot_rate,0) AS Quote_Out,
               ds.isin
        FROM ds
        WHERE ds.datum >= @from AND ds.datum <= @to
    ) tbl
    PIVOT (
        COUNT(Quote)
        FOR isin IN(AB000001,
                    AB000002, 
                    AB000003,
                    AB000004,
                    AB000005)
    ) piv
END

如何在动态查询中定义这个静态代码?我已经声明了 2 个变量。

我想你正在寻找这样的东西:

    ALTER PROCEDURE [dbo].[MonthRepo] 
        -- Add the parameters for the stored procedure here
        @from datetime,
        @to datetime
    AS
    BEGIN

        DECLARE @cols nvarchar(max)
        DECLARE @query nvarchar(max)

        SET NOCOUNT ON;

        WITH vals AS (
            SELECT DISTINCT isin
            FROM   ds
        )
        SELECT  @cols = COALESCE(@cols + ',','') + '[' + isin + ']'
        FROM    vals

        SET @query = '
            SELECT *
            FROM (
                SELECT ROUND(ds.ct_quot_rate,0) AS Quote,
                       ROUND(ds.ct_quot_rate,0) AS Quote_Out,
                       ds.isin
                FROM ds
                WHERE ds.datum >= @from_param AND ds.datum <= @to_param
            ) tbl
            PIVOT (
                COUNT(Quote)
                FOR isin IN(' + @cols + ' )
            ) piv'

        EXECUTE sp_executesql @query, N'@from_param DATETIME, @to_param DATETIME', @from_param = @from, @to_param = @to
    END
CREATE PROCEDURE [dbo].[MonthRepo] 
        -- Add the parameters for the stored procedure here
        @from VARCHAR(20),
        @to VARCHAR(20)
    AS
    BEGIN
    IF OBJECT_ID('tempdb..#T') IS NOT NULL 
DROP TABLE #T

create  table #T
(
  datnum varchar(20),
  quote INT,
  isin VARCHAR(20)
)
insert into #T (datnum,quote,isin)values ('2015-01-01',100,'AB000001'),
('2015-01-01',100,'AB000002'),
('2015-01-02',98,'AB000003'),
('2015-01-02',70,'AB000001'),
('2015-01-03',100,'AB000001')
    DECLARE @statement NVARCHAR(max)
    ,@columns NVARCHAR(max)



SELECT @columns = Isnull(@columns + ', ', '') + N'[' + tbl.isin+ ']'
FROM   (SELECT DISTINCT isin
        FROM   #T) AS tbl
--SELECT @columns
SELECT @statement = '  SELECT *
    FROM (
        SELECT ROUND(ds.quote,0) AS Quote,
               ROUND(ds.quote,0) AS Quote_Out,
               ds.isin
        FROM #T ds
        WHERE ds.datnum >=  CONVERT(datetime,'+''''+@from+''' ,105) AND ds.datnum <=  CONVERT(datetime,'''+@to+''' ,105) 

    ) tbl
    PIVOT (
        COUNT(Quote)
        FOR isin IN(' + @columns+ ')) as PVT

' 

PRINT @statement
EXEC sp_executesql @statement = @statement


    END


EXEC [MonthRepo] @from = '2015-01-01',@to = '2015-01-10'