Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
sql数据透视表(日期、字符串)_Sql_Sql Server_Tsql - Fatal编程技术网

sql数据透视表(日期、字符串)

sql数据透视表(日期、字符串),sql,sql-server,tsql,Sql,Sql Server,Tsql,我有一张桌子 如何编写select以使其看起来像表2 日期范围由用户选择,小时列为字符串类型 例如: 用户希望报告2015年1月1日至2015年3月1日期间每个工人的工作小时数。 因此,他从1.1.2015日期时间选择器输入到1.3.2015日期时间选择器。您可以使用PIVOT语法,将MIN或MAX作为小时列的一个负号,因为在这种情况下,它会检索每个工作者/日期的单个值。希望对你有用 declare @str varchar(MAX) declare @q varchar(MAX) declar

我有一张桌子

如何编写select以使其看起来像表2

日期范围由用户选择,小时列为字符串类型

例如: 用户希望报告2015年1月1日至2015年3月1日期间每个工人的工作小时数。
因此,他从1.1.2015日期时间选择器输入到1.3.2015日期时间选择器。

您可以使用PIVOT语法,将MIN或MAX作为小时列的一个负号,因为在这种情况下,它会检索每个工作者/日期的单个值。希望对你有用

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)

这是用于哪个RDBMS的?请添加一个标记,以指定您使用的是mysql、postgresql、sql server、oracle还是db2,或者其他完全不同的东西。很抱歉,如果HOURS列为string,则MS SQLI无法使用MIN函数。我还需要任何日期间隔,而不仅仅是特定的2天。您可以在SQL中为字符串列使用MIN/MAX。对于不同的日期,我唯一的想法就是使用动态查询。我刚刚编辑了我的答案。希望它能工作,谢谢,但我不知道如何更改它以接受输入值,这样用户就可以输入日期间隔从-到。从和到不是来自相同的数据?。也许你需要重新表述你的问题,包括你所需要的一切。我确实添加了一个例子。
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)