2013-05-06 77 views
-1

我正在尋找一種有效的方法來按SQL Server中的星期名稱轉換列。在SQL Server 2008中按星期名稱顯示數據

這是我的例子:

Id Value ondate 
1 10  06/05/2013  
2 9  07/05/2013  
3 5  08/05/2013  
4 89  09/05/2013  
5 8  10/05/2013 

場景#1:

  • 開始日期:2013年6月5日(星期一)
  • 結束日期:14/05/2013(星期四)

這是我的結果:

 mo tu we th fr sa su 
row1 10 9 5 89 8 23 3 
row2 5 8 

方案#2:

  • 開始日期:2013年6月5日(星期一)
  • 結束日期:2013年7月5日(星期四)

這是我所希望的結果:

 mo tu 
row1 10 9 

我該如何建立結果?

+0

使用CTE和數據透視 – MaxRecursion 2013-05-06 06:25:58

+1

@AnilDiggiwal:你嘗試過什麼? – 2013-05-06 06:27:37

回答

0

使用如下所示的sum(case...將數據作爲列轉向數天(或查看PIVOT運算符)。此外,請考慮多年可能會影響您的結果,並相應地調整分組。

set dateformat dmy; 
set datefirst 1; --monday 

declare @YourTable table (Id int, Value int, ondate datetime) 
insert into @YourTable 
    select 1, 10, '06/05/2013' union all  
    select 2, 9, '07/05/2013' union all  
    select 3, 5, '08/05/2013' union all  
    select 4, 89, '09/05/2013' union all  
    select 5, 8, '10/05/2013' union all 
    select 6, 23, '11/05/2013' union all 
    select 7, 3, '12/05/2013' union all 
    select 8, 5, '13/05/2013' union all 
    select 9, 8, '14/05/2013' 

select [mo]=sum(case when datename(weekday, ondate) = 'Monday' then Value else 0 end), 
     [tu]=sum(case when datename(weekday, ondate) = 'Tuesday' then Value else 0 end), 
     [we]=sum(case when datename(weekday, ondate) = 'Wednesday' then Value else 0 end), 
     [th]=sum(case when datename(weekday, ondate) = 'Thursday' then Value else 0 end), 
     [fr]=sum(case when datename(weekday, ondate) = 'Friday' then Value else 0 end), 
     [sa]=sum(case when datename(weekday, ondate) = 'Saturday' then Value else 0 end), 
     [su]=sum(case when datename(weekday, ondate) = 'Sunday' then Value else 0 end) 
from @YourTable 
where ondate between '06/05/2013' and '14/05/2013' 
group 
by  datepart(week, ondate); 

-- Result: 
/* 
mo tu we th fr sa su 
10 9 5 89 8 23 3 
5 8 0 0 0 0 0 
*/ 
+0

thx幫助,但方案#2在查詢中不匹配... – 2013-05-06 07:08:32

+0

如果你想省略列,那麼你將不得不使用動態sql。國際海事組織,這種事最好在表現層完成。 – 2013-05-06 15:56:47

0

試試這個使用PIVOT: -

Declare @startDate datetime,@endDate datetime 
Set @startDate = '05/06/2013' 
Set @endDate = '05/14/2013' 


Select sum([Monday]) as Mo,sum([Tuesday]) as Tu, 
     sum([wednesday]) as Wed,sum([Thursday]) as Th,sum([Friday]) as Fr, 
     sum([Saturday]) as St,sum([Sunday]) as Su 
from 
(
    Select value,datename(weekday,ondate) as dayName,ondate 
    from @Sample 
    where ondate >= @startDate and ondate <= @endDate 
)p 
pivot 
(
min(value) 
for dayName in ([Monday],[Tuesday],[wednesday],[Thursday],[Friday], 
       [Saturday],[Sunday]) 
)pvt 
group by datename(week,ondate) 

開始日期輸出:2013年5月6日(星期一) 結束日期:2013年5月14日(星期四)

╔════╦══════╦══════╦══════╦══════╦══════╦══════╗ 
║ Mo ║ Tu ║ Wed ║ Th ║ Fr ║ St ║ Su ║ 
╠════╬══════╬══════╬══════╬══════╬══════╬══════╣ 
║ 10 ║ 9 ║ 5 ║ 89 ║ 8 ║ 23 ║ 3 ║ 
║ 12 ║ NULL ║ NULL ║ NULL ║ NULL ║ NULL ║ NULL ║ 
╚════╩══════╩══════╩══════╩══════╩══════╩══════╝ 

開始日期期間的輸出:05/06/2013(星期一) 結束日期:2013年5月7日(星期四)

╔════╦════╦══════╦══════╦══════╦══════╦══════╗ 
║ Mo ║ Tu ║ Wed ║ Th ║ Fr ║ St ║ Su ║ 
╠════╬════╬══════╬══════╬══════╬══════╬══════╣ 
║ 10 ║ 9 ║ NULL ║ NULL ║ NULL ║ NULL ║ NULL ║ 
╚════╩════╩══════╩══════╩══════╩══════╩══════╝ 

演示在SQL FIDDLE

+0

thx for幫助,但方案#2不匹配查詢... 開始日期:06/05/2013(星期一) 結束日期:07/05/2013(星期四)所以沒有顯示額外的列 – 2013-05-06 09:57:46

+0

各種演示材料應該在前端完成。 SQL Server並不意味着這一點。正在努力達成的目標。在您的要求中,您要更具體。你需要在報告中顯示數據嗎? – praveen 2013-05-06 10:08:04