在SQL数据透视图中使用动态日期

时间:2018-07-20 23:10:03

标签: sql-server-2008 sql-server-2012

我有下面的代码,效果很好,但是我不想每天继续输入日期。

我的日期将始终是过去7天(包括今天)-这意味着该表将每天清除,并且每天都会提取新数据。

select *
from
(
 select EMP_ID, EMP_SHORT_NAME, SEG_CODE, 
NOM_DATE
from sick_codes_Test$
) src
pivot
(
max(seg_code)
for nom_date in ([2018-07-14], [2018-07-15],[2018-07-16],[2018-07-17],[2018-07-18],
           [2018-07-19], [2018-07-20])
) piv

那么对于“ nom_date in”,如何将那些日期设置为表中的日期?

我尝试了以下链接以及以下链接

https://www.mssqltips.com/sqlservertip/2783/script-to-create-dynamic-pivot-queries-in-sql-server/

但是无法使其正常工作

通过遵循上述网址,我想到了这段代码

DECLARE @columns NVARCHAR(MAX), @sql NVARCHAR(MAX);
SET @columns = N'';
SELECT @columns += N',' + QUOTENAME(NOM_DATE)
FROM   sick_codes_Test$  

SET @sql = N'
SELECT ' + STUFF(@columns, 1, 2, '') + '
FROM
(
 SELECT EMP_ID, EMP_SHORT_NAME, SEG_CODE
 from sick_codes_Test$
) AS j
PIVOT
(
  max(seg_code) FOR nom_date IN ('
  + STUFF(REPLACE(@columns, ',  [', ',['), 1, 1, '')
  + ')
) AS p;';
PRINT @sql;
EXEC sp_executesql @sql;

任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:0)

在进一步研究之后,我认为我找到了一种可能的解决方案,但是在运行以下代码之后,我看到EMP_ID被复制。

DECLARE @DynamicPivotQuery AS NVARCHAR(MAX)
DECLARE @ColumnName AS NVARCHAR(MAX)

--Get distinct values of the PIVOT Column 
SELECT @ColumnName= ISNULL(@ColumnName + ',','') 
   + QUOTENAME(NOM_DATE)
FROM (SELECT DISTINCT NOM_DATE FROM sick_codes_Test$ ) AS NOM_DATE
 order by NOM_DATE ASC
--Prepare the PIVOT query using the dynamic 
SET @DynamicPivotQuery = 
  N'SELECT EMP_ID, EMP_SHORT_NAME, ' + @ColumnName + '
    FROM sick_codes_Test$
PIVOT(MAX(SEG_CODE) 
      FOR NOM_DATE IN (' + @ColumnName + ')) AS PVTTable'
--Execute the Dynamic Pivot Query
EXEC sp_executesql @DynamicPivotQuery

经过更多修改,我终于找到了可行的解决方案

DECLARE @DynamicPivotQuery AS NVARCHAR(MAX)
DECLARE @ColumnName AS NVARCHAR(MAX)

--Get distinct values of the PIVOT Column 
SELECT @ColumnName= ISNULL(@ColumnName + ',','') 
   + QUOTENAME(NOM_DATE)
FROM (SELECT DISTINCT NOM_DATE FROM sick_codes_Test$ ) AS NOM_DATE
order by NOM_DATE ASC
--Prepare the PIVOT query using the dynamic 
SET @DynamicPivotQuery = 
N'SELECT EMP_ID, EMP_SHORT_NAME, ' + @ColumnName + '
FROM (
SELECT DISTINCT EMP_ID,
EMP_SHORT_NAME,
SEG_CODE,
NOM_DATE
FROM sick_codes_Test$
)t
PIVOT(MAX(SEG_CODE) 
      FOR NOM_DATE IN (' + @ColumnName + ')) AS PVTTable'
--Execute the Dynamic Pivot Query
EXEC sp_executesql @DynamicPivotQuery