简体   繁体   English

SQL Server-存储过程问题以获取矩阵类型的数据

[英]SQL Server - Stored Procedure issue to get Matrix type of data

Need help, struggling to do this please 需要帮助,请努力进行

Got the following fields in table 在表中获得以下字段

Package_Name
Package_StartTime
Package_Endtime

What I require is: 我需要的是:

Based on data range give me how much time each package took time to execute 根据数据范围,我可以了解每个程序包执行所需的时间

like 喜欢

Package Name - 21 Sept    22 Sept    23 Sept
ABC             3 mins     4 mins      2 mins

This way I want to see the execution time pattern of the packages. 这样,我想查看程序包的执行时间模式。

Try this to get the data 试试这个来获取数据

select package_Name as Package,Package_StartTime as Start,
        DateDiff(s,Package_StartTime,Package_EndTime) as Time
from table
where Package_StartTime >= @StartOfRange and Package_EndTime <= @EndOfRange

You could format the seconds to time inside SQL if you want using 如果要使用SQL,可以在SQL中格式化秒的时间

cast((DateDiff(s,Package_StartTime,Package_EndTime) / 60) as varchar(2)) + 
  ':' + cast((DateDiff(s,Package_StartTime,Package_EndTime) % 60) as varchar(2))

This will return a result set looking like this... 这将返回结果集,如下所示:

 Package     Start       Time 
  ABC         9/21/2011   360 
  ABC         9/22/2011   570 
  etc.

or 要么

 Package     Start       Time 
  ABC         9/21/2011   6:00 
  ABC         9/22/2011   9:30 
  etc.

Depending on how you get the Time column 取决于您如何获取“时间”列

If you are using SQL 2005 and above, you can use PIVOT to spread this across columns... Here is a good link with an example of how to use PIVOT 如果您使用的是SQL 2005及更高版本,则可以使用PIVOT将其分布在各个列中...这是一个很好的链接,提供了有关如何使用PIVOT的示例

Quick PIVOT example, not tested, but hopefully gets you started. 快速的PIVOT示例,未经测试,但希望可以帮助您入门。

select * from PackageTableAbove
pivot (max (Time) for Start in ([9/21/2011],[9/22/2011],
                 [9/23/2011],[9/24/20111])) as PackageTimePerDay

If you don't want to hard-code the dates, you can look at using dynamic SQL to build the above statement. 如果您不想对日期进行硬编码,则可以考虑使用动态SQL构建上述语句。 I am using Max(Time) under the assumption each package runs once per day. 我在每个程序包每天运行一次的假设下使用Max(Time)。

For every package, this query will calculate execution time in minutes for every day between StartTime and EndTime . 对于每个包,此查询将计算StartTimeEndTime之间每天的执行时间,以分钟为单位。

Solution: 解:

CREATE TABLE dbo.Package
(
    Name NVARCHAR(10) PRIMARY KEY
    ,StartTime DATETIME NOT NULL
    ,EndTime DATETIME NOT NULL
);

INSERT  dbo.Package 
SELECT  'A', '2011-01-01T00:02:00', '2011-01-01T00:05:00'
UNION ALL
SELECT  'B', '2011-01-01T23:50:00', '2011-01-02T00:04:00'
UNION ALL
SELECT  'C', '2011-01-01T23:50:00', '2011-01-01T23:59:00'
UNION ALL
SELECT  'D', '2011-01-02T22:10:00', '2011-01-05T01:00:00';

WITH PivotSource
AS
(
    SELECT  a.Name
            ,CONVERT(VARCHAR(25),b.DayStartTime,112) [Day]
            ,DATEDIFF(MINUTE,b.DayStartTime,b.DayEndTime) DayMinutes
    FROM    dbo.Package a
    CROSS APPLY
    (
        SELECT  v.number
                ,CONVERT(VARCHAR(25),DATEADD(DAY,v.number,a.StartTime),112) IntermediateTime
                ,CASE 
                    WHEN v.number=0 THEN a.StartTime
                    ELSE CONVERT(VARCHAR(25),DATEADD(DAY,v.number,a.StartTime),112)
                END DayStartTime
                ,CASE 
                    WHEN CONVERT(VARCHAR(25),a.EndTime,112)=CONVERT(VARCHAR(25),DATEADD(DAY,v.number,a.StartTime),112) THEN a.EndTime
                    ELSE CONVERT(VARCHAR(25),DATEADD(DAY,v.number,a.StartTime),112)+' 23:59:59.999'
                END DayEndTime          
        FROM    master.dbo.spt_values v
        WHERE   v.type = 'P'
        AND     v.number <= DATEDIFF(DAY,a.StartTime,a.EndTime)
    ) b
)
SELECT  pvt.*
FROM    PivotSource cte
PIVOT( SUM(cte.DayMinutes) FOR cte.[Day] IN ([20110101],[20110102],[20110103],[20110104],[20110105]) ) pvt

DROP TABLE dbo.Package;

Results: 结果:

Name       20110101    20110102    20110103    20110104    20110105
---------- ----------- ----------- ----------- ----------- -----------
A          3           NULL        NULL        NULL        NULL
B          10          4           NULL        NULL        NULL
C          9           NULL        NULL        NULL        NULL
D          NULL        110         1440        1440        60

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM