2015-11-28 28 views
-4

我有一個表SQL數據透視表(日期字符串)

enter image description here

Select * from Table1. 

我怎麼能寫選擇看起來像表2?

enter image description here

日期範圍是由用戶選擇的和時間列是字符串類型。

示例: 用戶希望在2015年1月1日至2015年1月15日之間爲每位工作人員提供小時報告。 因此,他輸入FROM 1.1.2015(dateTime選擇器)和TO 1.3.2015(dateTime選擇器)。

+0

哪個RDBMS是這樣的?請添加一個標籤來指定您是使用'mysql','postgresql','sql-server','oracle'還是'db2' - 或者其他的東西。 –

+0

對不起,用於MS SQL – hurikhan

回答

1

您可以通過使用MIN或MAX作爲HOURS列的聚合來使用PIVOT語法,因爲在這種情況下,它會爲每個WORKER/DATE返回單個值。希望對你有效。

declare @str varchar(MAX) 
declare @q varchar(MAX) 
declare @fromDate date 
declare @toDate date 

set @fromDate ='2015-01-01' 
set @toDate ='2015-03-01' 
set @str='' 
select @str = @str + '[' + cast(DATE as varchar) + '],' 
from (select distinct DATE from Table1 where DATE between @fromDate and @toDate) as A 

set @q = 
'SELECT WORKER, '+left(@str,len(@str)-1)+' 
FROM 
(SELECT WORKER, DATE, HOURS 
FROM Table1) p 
PIVOT 
(
MIN (HOURS) 
FOR [DATE] IN 
('+left(@str,len(@str)-1)+') 
) AS pvt' 
exec (@q) 
+0

如果HOURS列是字符串,那麼我不能使用MIN函數。我還需要任何日期間隔,而不僅僅是特定的2天。 – hurikhan

+0

您可以在SQL中使用MIN/MAX作爲字符串列。對於不同的日期,我唯一的想法是使用動態查詢。我剛剛編輯了我的答案。希望它的工作 – pcofre

+0

它的工作原理,謝謝,但我不知道如何改變它接受輸入值,所以用戶可以輸入日期間隔從 - 到。 – hurikhan