2

这就是我的原始数据库的样子:

+-------------+----------+---------------------+------+
| StationName | State    | Start_time          | Time |
+-------------+----------+---------------------+------+
| P3          | Downtime | 2018-02-14 13:57:39 | 83   |
+-------------+----------+---------------------+------+
| P4          | Downtime | 2018-02-14 13:57:39 | 118  |
+-------------+----------+---------------------+------+
| P3          | Downtime | 2018-02-15 06:52:51 | 6    |
+-------------+----------+---------------------+------+
| P4          | Downtime | 2018-02-15 06:52:51 | 11   |
+-------------+----------+---------------------+------+
| P2          | Downtime | 2018-02-15 07:04:16 | 60   |
+-------------+----------+---------------------+------+
| P8          | Downtime | 2018-02-15 07:04:16 | 7    |
+-------------+----------+---------------------+------+

这是我用来实现当前结果的代码:

SELECT * FROM(
SELECT CAST([start_time] as DATE) AS [DATE], 
State, 
Sum(Time) AS Downtime,
STATIONNAME 

FROM A6K_Events 

Where StationName Like 'P%' AND State='Downtime' AND (Dep != 'Event Log 
Error' OR Dep IS NULL)
GROUP BY [start_time],STATIONNAME, State
) AS S
PIVOT (sum(Downtime) FOR STATIONNAME IN([P1],[P2],[P3],[P4],[P5],[P6],[P7], 
[P8],[P9],[P10])) AS PT

我目前的结果是:

+------------+----------+------+------+----+-----+------+------+------+------+------+------+ | DATE | State | P1 | P2 | P3 | P4 | P5 | P6 | P7 | P8 | P9 | P10 | +------------+----------+------+------+----+-----+------+------+------+------+------+------+ | 2018-02-14 | Downtime | NULL | NULL | 83 | 118 | NULL | NULL | NULL | NULL | NULL | NULL | +------------+----------+------+------+----+-----+------+------+------+------+------+------+ | 2018-02-15 | Downtime | NULL | 60 | 6 | 11 | NULL | NULL | NULL | 7 | NULL | NULL | +------------+----------+------+------+----+-----+------+------+------+------+------+------+

我尝试了许多不同的位置和方法将其转换为分秒。我最终遇到了一系列错误,我不确定我做错了什么。我用于将秒转换为小时分钟秒的方法如下。我不确定这是否与我正在使用的格式不兼容,或者我是否将其放在正确的位置或现在。下面这个 Convert 函数中的列引用也可能不准确。

(CONVERT(varchar(6), sum(time)/3600) + ':' +
                    RIGHT('0' + CONVERT(varchar(2), (sum(time) % 3600) / 60), 2)+ ':' +
                    RIGHT('0' + CONVERT(varchar(2), sum(time) % 60), 2)) AS DowntimeMinSec,

有谁知道实现我的目标的好方法,即以小时分钟秒为单位显示每个进程每天的停机时间总和?我的“当前结果”粘贴文本表正是我需要的,只是总和不是秒格式。任何帮助我将不胜感激,谢谢。

编辑:这被标记为与旋转无关的帖子的副本。这篇文章是关于在使用枢轴时进行适当转换,而不仅仅是一般地转换时间。我的帖子也不包含与毫秒有关的任何内容。如果这被标记为不重复,我将不胜感激,因为这是一种不同的情况,我在已经理解这篇文章被标记为重复的概念的同时苦苦挣扎。

我的预期输出是我当前的结果,但在 H:mm:ss

为先生编辑。标签:使用他标记为我的副本的帖子中的方法重做尝试和错误

1

SELECT CONVERT(varchar, DATEADD(ms, sum(downtime), 0), 108), * FROM(
SELECT CAST([start_time] as DATE) AS [DATE], 
State, 
Sum(Time) AS Downtime,
STATIONNAME 

FROM A6K_Events 

Where StationName Like 'P%' AND State='Downtime' AND (Dep != 'Event Log 
Error' OR Dep IS NULL)
GROUP BY [start_time],STATIONNAME, State
) AS S
PIVOT (sum(Downtime) FOR STATIONNAME IN([P1],[P2],[P3],[P4],[P5],[P6],[P7], 
[P8],[P9],[P10])) AS PT

GatewayException: Invalid column name 'downtime'.
caused by SQLServerException: Invalid column name 'downtime'.

2

SELECT * FROM(
SELECT CAST([start_time] as DATE) AS [DATE], 
State, 
Sum(Time) AS Downtime,
STATIONNAME 

FROM A6K_Events 

Where StationName Like 'P%' AND State='Downtime' AND (Dep != 'Event Log 
Error' OR Dep IS NULL)
GROUP BY [start_time],STATIONNAME, State
) AS S
PIVOT (CONVERT(varchar, DATEADD(ms, sum(downtime), 0), 108)) FOR STATIONNAME 
IN([P1],[P2],[P3],[P4],[P5],[P6],[P7],[P8],[P9],[P10])) AS PT

GatewayException: Incorrect syntax near the keyword 'CONVERT'.
caused by SQLServerException: Incorrect syntax near the keyword 'CONVERT'.

3

SELECT CONVERT(varchar, DATEADD(ms, sum(time), 0), 108), * FROM(
SELECT CAST([start_time] as DATE) AS [DATE], 
State, 
Sum(Time) AS Downtime,
STATIONNAME 

FROM A6K_Events 

Where StationName Like 'P%' AND State='Downtime' AND (Dep != 'Event Log 
Error' OR Dep IS NULL)
GROUP BY [start_time],STATIONNAME, State
) AS S
PIVOT (sum(Downtime) FOR STATIONNAME IN([P1],[P2],[P3],[P4],[P5],[P6],[P7], 
[P8],[P9],[P10])) AS PT

GatewayException: Invalid column name 'time'.
caused by SQLServerException: Invalid column name 'time'.  
4

2 回答 2

1

您可以尝试以下查询:

SELECT * FROM(
SELECT CAST([start_time] as DATETIME2) AS [DATE], 
State, 
Sum(Time) AS Downtime,
STATIONNAME 

FROM A6K_Events 

Where StationName Like 'P%' AND State='Downtime' 
AND (Dep != 'Event LogError' OR Dep IS NULL)
GROUP BY [start_time],STATIONNAME, State
) AS S
PIVOT (sum(Downtime) FOR STATIONNAME IN([P1],[P2],[P3],[P4],[P5],[P6],[P7], 
[P8],[P9],[P10])) AS PT

输出:

在此处输入图像描述

于 2018-07-31T14:43:33.490 回答
0

罗斯布什在评论中指出了我试图去的方向,谢谢大家的回复。在我的外部查询中,我需要引用转换时旋转的列,而不是引用列的先前名称。

于 2018-07-31T14:50:54.997 回答