在 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'
目前我在 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'