2013-05-03 89 views
1

您好我有考勤查詢,這將產生使用旋轉功能更改列名

這裏的考勤報表的過程:

declare @in_date DATETIME  

/*Select all the stagign entries related to promotion id and investment type id */  
    /* also only those staging daat related interface status tracking*/ 

    -- Getting all distinct dates into a temporary table #Dates 
    SELECT a.date as full_date_of_attendence INTO #Dates 
    FROM dbo.getFullmonth(@in_date) a 
    ORDER BY a.date 



    -- The number of days will be dynamic. So building 
    -- a comma seperated value string from the dates in #Dates 
    SELECT @cols = COALESCE(@cols + ',[' + CONVERT(varchar, full_date_of_attendence, 106) 
            + ']','[' + CONVERT(varchar, full_date_of_attendence, 106) + ']') 
    FROM #Dates 
    ORDER BY full_date_of_attendence 


    --select @cols 

    ---- Building the query with dynamic dates 

SET @qry = 
    'SELECT * FROM 
    (SELECT admission_id, attendence_status , date_of_attendence 
    FROM dbo.tblattendence)emp 
    PIVOT (MAX(attendence_status) FOR date_of_attendence IN (' + @cols + ')) AS stat'  



    -- Executing the query 
    EXEC(@qry) 

    -- Dropping temporary tables 
    DROP TABLE #Dates 

這裏是上述查詢的輸出::

admission_id 01 May 2013 02 May 2013 03 May 2013 
2    NULL    1    0 
3    NULL    1    1 
4    NULL    0    0 
5    NULL    0    1 

在這裏,我想改變列的名稱作爲01,02,03...... ,我想爲「P」 0的值1作爲'A'

任何人都可以幫助我實現這?

+0

use select admission_id as AdmsnId FROM dbo.tblattendence – NetStarter 2013-05-03 13:26:28

回答

0

我會建議您的代碼進行以下更改。如果你想要一個日期列表(1,2,3等),那麼你可以使用DAY函數。

通常當我得到列的列表動態,我的選擇是使用STUFFFOR XML PATH,我會改變該代碼如下:

select @colsPiv = STUFF((SELECT ',' + QUOTENAME(cast(day(full_date_of_attendence) as varchar(2))) 
       from #Dates 
       GROUP BY full_date_of_attendence 
       ORDER BY full_date_of_attendence 
     FOR XML PATH(''), TYPE 
     ).value('.', 'NVARCHAR(MAX)') 
    ,1,1,'') 

然後,如果你想更換0A和一個1P,你將要創建一個查詢來獲取列的列表替換值:

select @colsSel = STUFF((SELECT ', case when ' + QUOTENAME(cast(day(full_date_of_attendence) as varchar(2)))+'= 1 then ''P'' else ''A'' end as '+QUOTENAME(cast(day(full_date_of_attendence) as varchar(2))) 
         from #Dates 
         GROUP BY full_date_of_attendence 
         ORDER BY full_date_of_attendence 
       FOR XML PATH(''), TYPE 
       ).value('.', 'NVARCHAR(MAX)') 
       ,1,1,'') 

基本上,這是肌酸GA類似這樣的選擇列表:

select case when [1] = 1 then 'P' else 'A' end as [1], ... 

那麼你最終的查詢將是:

SET @qry = 
'SELECT admission_id, '[email protected] +' 
FROM 
(
    SELECT admission_id, 
     attendence_status , 
     day(date_of_attendence) date_of_attendence 
    FROM dbo.tblattendence 
)emp 
PIVOT 
(
    MAX(attendence_status) 
    FOR date_of_attendence IN (' + @colsPiv + ') 
) AS stat' 

SQL Fiddle with Demo

0

,讓我們改變只是你想要的兩樣東西,即

  1. CONVERT(CHAR(2), full_date_of_attendence, 106) - 使用CHAR(2)代替varchar
  2. CASE attendence_status when 1 then 'P' else 'A' END在選擇...

代碼的變化很小。希望這有助於您瞭解未來如何對其他代碼進行類似更改。

declare @in_date DATETIME 

/*Select all the stagign entries related to promotion id and investment type id */  
/* also only those staging daat related interface status tracking*/ 

-- Getting all distinct dates into a temporary table #Dates 
SELECT a.date as full_date_of_attendence INTO #Dates 
FROM dbo.getFullmonth(@in_date) a 
ORDER BY a.date 



-- The number of days will be dynamic. So building 
-- a comma seperated value string from the dates in #Dates 
SELECT @cols = COALESCE(@cols + ',', '') + [' + 
     CONVERT(CHAR(2), full_date_of_attendence, 106) + ']' 
FROM #Dates 
ORDER BY full_date_of_attendence 


--select @cols 

---- Building the query with dynamic dates 

SET @qry = 
'SELECT * FROM 
(SELECT admission_id, CASE attendence_status when 1 then 'P' else 'A' END, date_of_attendence 
FROM dbo.tblattendence)emp 
PIVOT (MAX(attendence_status) FOR date_of_attendence IN (' + @cols + ')) AS stat'  



-- Executing the query 
EXEC(@qry) 

-- Dropping temporary tables 
DROP TABLE #Dates