Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/85.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 Server:透视功能,需要透视表_Sql_Sql Server_Subquery_Pivot_Correlated Subquery - Fatal编程技术网

SQL Server:透视功能,需要透视表

SQL Server:透视功能,需要透视表,sql,sql-server,subquery,pivot,correlated-subquery,Sql,Sql Server,Subquery,Pivot,Correlated Subquery,我在SQL Server中有以下格式的数据 -ID ID2 status time -1384904453 417 stop 2013-11-19 23:40:43.000 -1384900211 417 start 2013-11-19 22:30:06.000 -1384822614 417 stop 2013-11-19 00:56:36.000 -1384813810 417 start 2013-11-18 22:30:06.0

我在SQL Server中有以下格式的数据

-ID          ID2  status  time
-1384904453  417  stop    2013-11-19 23:40:43.000
-1384900211  417  start   2013-11-19 22:30:06.000
-1384822614  417  stop    2013-11-19 00:56:36.000
-1384813810  417  start   2013-11-18 22:30:06.000
-1384561199  417  stop    2013-11-16 00:19:45.000
-1384554623  417  start   2013-11-15 22:30:06.000
-1384475231  417  stop    2013-11-15 00:26:58.000
-1384468224  417  start   2013-11-14 22:30:06.000
-1384388181  417  stop    2013-11-14 00:16:20.000
-1384381807  417  start   2013-11-13 22:30:06.000
-1384300222  417  stop    2013-11-12 23:50:11.000
-1384295414  417  start   2013-11-12 22:30:06.000
-1384218209  417  stop    2013-11-12 01:03:17.000
-1384209015  417  start   2013-11-11 22:30:06.000
我需要的是能够以以下格式显示数据

-ID2  start                      stop
-417  2013-11-19 22:30:06.000    2013-11-19 23:40:43.000
-417  2013-11-18 22:30:06.000    2013-11-19 00:56:36.000

有可能这样做吗?我尝试在SQL Server中使用pivot,但它只返回一条记录。有人能帮忙吗?

您不需要PIVOT查询来获取所需的信息。您可以执行以下操作:

SELECT mt1.ID2, mt1.time AS start,
(
   SELECT TOP 1 mt2.time
   FROM MyTable AS mt2
   WHERE mt2.status = 'stop' 
     AND mt2.time >= mt1.time
   ORDER BY mt2.time 
) AS stop
FROM MyTable AS mt1
WHERE mt1.status = 'start' 
如果在SQL Server中执行上述查询,而不是在MS Access中执行,则需要使用
TOP(1)
,而不仅仅是
TOP 1


下面是在SQL Server中演示上述查询的示例。

您可以使用PIVOT函数来获得结果,我只需将
行数()窗口函数应用于数据,这样您就可以为每个
ID2
返回多行:

select id2, start, stop
from
(
  select id2, status, time,
    row_number() over(partition by status
                      order by time) seq
  from yourtable
) d
pivot
(
  max(time)
  for status in (start, stop)
) piv
order by start desc;

还可以使用聚合函数和CASE表达式来获得最终结果:

select
  id2,
  max(case when status = 'start' then time end) start,
  max(case when status = 'start' then time end) stop
from 
(
  select id2, status, time,
    row_number() over(partition by status
                      order by time) seq
  from yourtable
) d
group by id2, seq;

请看

我真的非常感谢这个解决方案。没有row_number()函数,我只能得到第一条记录。现在我学习了一个新函数row_number()。非常感谢:)