Sql server 使用SQL Server 2008 R2在两个日期之间透视表
我有下表: 例如: 插入一些记录:Sql server 使用SQL Server 2008 R2在两个日期之间透视表,sql-server,sql-server-2008-r2,pivot,Sql Server,Sql Server 2008 R2,Pivot,我有下表: 例如: 插入一些记录: insert into test values('2014-11-07','2014-12-01'); select * from test; col_dt1 col_dt2 ---------------------- 2014-11-07 2014-12-01 预期结果: col_dt1 col_dt2 07 November 2014 08 November 2014 .................... 01 Dec
insert into test values('2014-11-07','2014-12-01');
select * from test;
col_dt1 col_dt2
----------------------
2014-11-07 2014-12-01
预期结果:
col_dt1 col_dt2 07 November 2014 08 November 2014 .................... 01 December 2014
-----------------------------------------------------------------------------------------------
2014-11-07 2014-12-01 1 0 .................... 1
为了在透视表中包含stuff列,我不得不获取两个日期之间的所有日期
DECLARE @Start_Date DATE, @End_Date DATE, @QUERY NVARCHAR(MAX), @SUBQUERY NVARCHAR(MAX), @ROWCOUNT int
CREATE TABLE #TempTable(
ID int IDENTITY(1,1) NOT NULL,
Start_Date date,
End_Date date,
Dates NVARCHAR(50),
HasDate int
)
CREATE TABLE #TempTable2(
Start_Date date,
End_Date date,
Dates NVARCHAR(50),
HasDate int
)
SET @Start_Date = (SELECT TOP 1 col_dt1 from test)
SET @End_Date = (SELECT TOP 1 col_dt2 from test)
INSERT INTO #TempTable
SELECT
@Start_Date as Start_Date,
@End_Date as End_Date,
RIGHT(REPLICATE('0', DAY(DATEADD(DAY,number,@Start_Date))) + CAST(DAY(DATEADD(DAY,number,@Start_Date)) AS NVARCHAR(2)), 2)
+' '+DATENAME(MONTH,DATEADD(DAY,number,@Start_Date))+' '+CONVERT(NVARCHAR(50),YEAR(DATEADD(DAY,number,@Start_Date))) as Start_Date,
HasDate =
CASE
WHEN DATEADD(DAY,number,@Start_Date)=@Start_Date THEN 1
WHEN DATEADD(DAY,number,@Start_Date)=@End_Date THEN 1
ELSE 0
END
FROM master..spt_values
WHERE type = 'P'
AND DATEADD(DAY,number,@Start_Date) <= @End_Date
INSERT INTO #TempTable2 SELECT [Start_Date],[End_Date],[Dates],HasDate FROM #TempTable
SELECT * FROM #TempTable
SET @QUERY=''
SET @QUERY+='SELECT * FROM #TempTable2
PIVOT
(
Max(HasDate)
FOR Dates IN ('
SET @SUBQUERY=''
SET @ROWCOUNT=1
WHILE @ROWCOUNT <= (SELECT COUNT(*) FROM #TempTable)
BEGIN
SET @SUBQUERY=@SUBQUERY+'['+(SELECT CONVERT(NVARCHAR(50),Dates)as Dates FROM #TempTable WHERE ID=@ROWCOUNT)+']'
IF (@ROWCOUNT<>(SELECT COUNT(*) FROM #TempTable))
BEGIN
SET @SUBQUERY=@SUBQUERY+','
END
SET @ROWCOUNT=@ROWCOUNT+1
END
SET @QUERY=@QUERY+@SUBQUERY+')
)AS tblPivot'
PRINT(@QUERY)
EXECUTE(@QUERY)
DROP TABLE #TempTable
DROP TABLE #TempTable2
您可以尝试此操作。预期输出不正确clear@Pradeep,有两个日期,第一个和最后一个日期分别为2014-11-07和2014-12-01。我想显示从2014-11-07到2014-12-01的这些日期的数据透视表。它必须在列中显示这两个日期之间的所有日期。因此,这两个日期下的值必须为1,其他日期的值应为0@Meem如果您的表中再包含一行,例如2014-01-01、2014-01-31,该怎么办。在这种情况下,所需的输出是什么?@Meem在这种情况下,您可以考虑使用表值函数。Pivot用于旋转表值表达式。作为输入的不是表值表达式。它只是两个标量日期:开始日期和结束日期。
DECLARE @Start_Date DATE, @End_Date DATE, @QUERY NVARCHAR(MAX), @SUBQUERY NVARCHAR(MAX), @ROWCOUNT int
CREATE TABLE #TempTable(
ID int IDENTITY(1,1) NOT NULL,
Start_Date date,
End_Date date,
Dates NVARCHAR(50),
HasDate int
)
CREATE TABLE #TempTable2(
Start_Date date,
End_Date date,
Dates NVARCHAR(50),
HasDate int
)
SET @Start_Date = (SELECT TOP 1 col_dt1 from test)
SET @End_Date = (SELECT TOP 1 col_dt2 from test)
INSERT INTO #TempTable
SELECT
@Start_Date as Start_Date,
@End_Date as End_Date,
RIGHT(REPLICATE('0', DAY(DATEADD(DAY,number,@Start_Date))) + CAST(DAY(DATEADD(DAY,number,@Start_Date)) AS NVARCHAR(2)), 2)
+' '+DATENAME(MONTH,DATEADD(DAY,number,@Start_Date))+' '+CONVERT(NVARCHAR(50),YEAR(DATEADD(DAY,number,@Start_Date))) as Start_Date,
HasDate =
CASE
WHEN DATEADD(DAY,number,@Start_Date)=@Start_Date THEN 1
WHEN DATEADD(DAY,number,@Start_Date)=@End_Date THEN 1
ELSE 0
END
FROM master..spt_values
WHERE type = 'P'
AND DATEADD(DAY,number,@Start_Date) <= @End_Date
INSERT INTO #TempTable2 SELECT [Start_Date],[End_Date],[Dates],HasDate FROM #TempTable
SELECT * FROM #TempTable
SET @QUERY=''
SET @QUERY+='SELECT * FROM #TempTable2
PIVOT
(
Max(HasDate)
FOR Dates IN ('
SET @SUBQUERY=''
SET @ROWCOUNT=1
WHILE @ROWCOUNT <= (SELECT COUNT(*) FROM #TempTable)
BEGIN
SET @SUBQUERY=@SUBQUERY+'['+(SELECT CONVERT(NVARCHAR(50),Dates)as Dates FROM #TempTable WHERE ID=@ROWCOUNT)+']'
IF (@ROWCOUNT<>(SELECT COUNT(*) FROM #TempTable))
BEGIN
SET @SUBQUERY=@SUBQUERY+','
END
SET @ROWCOUNT=@ROWCOUNT+1
END
SET @QUERY=@QUERY+@SUBQUERY+')
)AS tblPivot'
PRINT(@QUERY)
EXECUTE(@QUERY)
DROP TABLE #TempTable
DROP TABLE #TempTable2