合并 SQL 中的两个返回行

Combing two returned rows in SQL

我有一个存储过程,我临时填充了值 returns 在我公司记录的工作上花费的时间,我已经将应该适合 4 个不同列的 JobTypeID 分组,Dev工作小时数、收费开发小时数、工作支持小时数和收费支持小时数。在 运行 代码过程中,由于我使用 GroupBy 子句的方式,它将数据分成多行,我该如何解决这个问题以便将数据输出到一行?

;WITH cte AS (

SELECT
       DATEPART(Year, StartTime) AS YearNumber,
       DATEPART(Month, StartTime) AS MonthNumber,
       DateName(Month, StartTime) + ' ' + CAST(DatePart(Year, StartTime) AS nvarchar(50)) AS TimePeriod,
       DATEADD(day, DATEDIFF(Day, 0, StartTime), 0) AS FromDate,
       DateDiff(minute, StartTime, EndTime) AS JobTime,
       tblJobWorkLog.ChargeableTime,
       WorkLogJobTypeID,
       tblJobWorkLog.SystemUserID

FROM
       tblJobWorkLog
       INNER JOIN tblJob ON tblJobWorkLog.JobID = tblJob.JobID
       INNER JOIN tblContact ON tblJob.ContactID = tblContact.ContactID

WHERE
       tblJobWorkLog.StartTime >= '20150511'
       AND tblJobWorkLog.EndTime <= '20150515'
       AND SystemUserID = '65405273-6BFD-4482-8A0D-BC6430AC996D'

)

SELECT
       FromDate,
       Case when WorkLogJobTypeID = 'FA5E6979-D228-44B7-A91B-8DDC8DDC709B' OR WorkLogJobTypeID = '3171B295-60E9-4724-95A3-04FA182D7D43' OR WorkLogJobTypeID = '52c2691f-ff0a-4263-a440-8a309f868f93' then (SUM(JobTime) / 60.0) end as SupportHoursWorked,
       Case when WorkLogJobTypeID = 'FA5E6979-D228-44B7-A91B-8DDC8DDC709B' OR WorkLogJobTypeID = '3171B295-60E9-4724-95A3-04FA182D7D43' OR WorkLogJobTypeID = '52c2691f-ff0a-4263-a440-8a309f868f93' then SUM(ChargeableTime) end AS SupportHoursCharged,
       Case when WorkLogJobTypeID = 'D0E910B1-B4BD-430C-AD04-EB4E67946806' OR WorkLogJobTypeID = 'B0BBF362-294D-4262-BED8-EDA7EE74745B' OR WorkLogJobTypeID = '1E333ADC-E4F2-4042-8B65-E25F2770D59F' OR WorkLogJobTypeID = 'A445B7CE-E9E4-48E6-B5AA-83C83F045315' 
       OR WorkLogJobTypeID = '1D83F510-87FA-446E-9337-3D0376210D57' OR WorkLogJobTypeID = 'B59C1596-E1D0-4118-A805-65208E27AFB5' OR WorkLogJobTypeID = 'F44A4B3C-B149-45A8-A9F0-5A57883482FD' then (SUM(JobTime) / 60.0) end as DevelopmentHoursWorked,
       Case when WorkLogJobTypeID = 'D0E910B1-B4BD-430C-AD04-EB4E67946806' OR WorkLogJobTypeID = 'B0BBF362-294D-4262-BED8-EDA7EE74745B' OR WorkLogJobTypeID = '1E333ADC-E4F2-4042-8B65-E25F2770D59F' OR WorkLogJobTypeID = 'A445B7CE-E9E4-48E6-B5AA-83C83F045315' 
       OR WorkLogJobTypeID = '1D83F510-87FA-446E-9337-3D0376210D57' OR WorkLogJobTypeID = 'B59C1596-E1D0-4118-A805-65208E27AFB5' OR WorkLogJobTypeID = 'F44A4B3C-B149-45A8-A9F0-5A57883482FD' then SUM(ChargeableTime) end as DevelopmentHoursCharged

FROM
       cte

GROUP BY
       FromDate, WorkLogJobTypeID
ORDER BY
       FromDate

结果:

2015-05-11  NULL        NULL        1.250000    1.250000
2015-05-11  1.166666    0.5         NULL        NULL
2015-05-12  0.000000    0.0         NULL        NULL
2015-05-12  NULL        NULL        3.250000    1.250000
2015-05-12  0.250000    0.000000    NULL        NULL
2015-05-12  NULL        NULL        0.250000    0.000000
2015-05-13  NULL        NULL        0.750000    0.750000
2015-05-13  0.000000    0.000000    NULL        NULL
2015-05-13  NULL        NULL        0.0         0.000000
2015-05-14  NULL        NULL        1.0         1.000000
2015-05-14  4.000000    1.166667    NULL        NULL
2015-05-14  NULL        NULL        1.0         0.750000

^ 我需要将日期结果合并成一行

对空列求和,否则会丢失结果,然后按日期分组

抱歉,第一次没有成功,您可以使用以下方法,现在应该可以得到您正在寻找的结果:

WITH cte AS (

SELECT
       DATEPART(Year, StartTime) AS YearNumber,
       DATEPART(Month, StartTime) AS MonthNumber,
       DateName(Month, StartTime) + ' ' + CAST(DatePart(Year, StartTime) AS nvarchar(50)) AS TimePeriod,
       DATEADD(day, DATEDIFF(Day, 0, StartTime), 0) AS FromDate,
       DateDiff(minute, StartTime, EndTime) AS JobTime,
       tblJobWorkLog.ChargeableTime,
       WorkLogJobTypeID,
       tblJobWorkLog.SystemUserID

FROM
       tblJobWorkLog
       INNER JOIN tblJob ON tblJobWorkLog.JobID = tblJob.JobID
       INNER JOIN tblContact ON tblJob.ContactID = tblContact.ContactID

WHERE
       tblJobWorkLog.StartTime >= '20150511'
       AND tblJobWorkLog.EndTime <= '20150515'
       AND SystemUserID = '65405273-6BFD-4482-8A0D-BC6430AC996D'

)

Select FromDate, SUM(SupportHoursWorked) SupportHoursWorked, SUM(SupportHoursCharged) SupportHoursCharged, SUM(DevelopmentHoursWorked) DevelopmentHoursWorked, SUM(DevelopmentHoursCharged) DevelopmentHoursCharged

From

(SELECT
       FromDate,
       Case when WorkLogJobTypeID = 'FA5E6979-D228-44B7-A91B-8DDC8DDC709B' OR WorkLogJobTypeID = '3171B295-60E9-4724-95A3-04FA182D7D43' OR WorkLogJobTypeID = '52c2691f-ff0a-4263-a440-8a309f868f93' then (SUM(JobTime) / 60.0) end as SupportHoursWorked,
       Case when WorkLogJobTypeID = 'FA5E6979-D228-44B7-A91B-8DDC8DDC709B' OR WorkLogJobTypeID = '3171B295-60E9-4724-95A3-04FA182D7D43' OR WorkLogJobTypeID = '52c2691f-ff0a-4263-a440-8a309f868f93' then SUM(ChargeableTime) end AS SupportHoursCharged,
       Case when WorkLogJobTypeID = 'D0E910B1-B4BD-430C-AD04-EB4E67946806' OR WorkLogJobTypeID = 'B0BBF362-294D-4262-BED8-EDA7EE74745B' OR WorkLogJobTypeID = '1E333ADC-E4F2-4042-8B65-E25F2770D59F' OR WorkLogJobTypeID = 'A445B7CE-E9E4-48E6-B5AA-83C83F045315' 
       OR WorkLogJobTypeID = '1D83F510-87FA-446E-9337-3D0376210D57' OR WorkLogJobTypeID = 'B59C1596-E1D0-4118-A805-65208E27AFB5' OR WorkLogJobTypeID = 'F44A4B3C-B149-45A8-A9F0-5A57883482FD' then (SUM(JobTime) / 60.0) end as DevelopmentHoursWorked,
       Case when WorkLogJobTypeID = 'D0E910B1-B4BD-430C-AD04-EB4E67946806' OR WorkLogJobTypeID = 'B0BBF362-294D-4262-BED8-EDA7EE74745B' OR WorkLogJobTypeID = '1E333ADC-E4F2-4042-8B65-E25F2770D59F' OR WorkLogJobTypeID = 'A445B7CE-E9E4-48E6-B5AA-83C83F045315' 
       OR WorkLogJobTypeID = '1D83F510-87FA-446E-9337-3D0376210D57' OR WorkLogJobTypeID = 'B59C1596-E1D0-4118-A805-65208E27AFB5' OR WorkLogJobTypeID = 'F44A4B3C-B149-45A8-A9F0-5A57883482FD' then SUM(ChargeableTime) end as DevelopmentHoursCharged

FROM
       cte

GROUP BY
       FromDate, WorkLogJobTypeID) a
       Group by FromDate

ORDER BY
       FromDate

这应该可以工作并且更具可读性:

;WITH cte AS (

SELECT
  DATEADD(day, DATEDIFF(Day, 0, StartTime), 0) AS FromDate,
  DateDiff(minute, StartTime, EndTime) AS JobTime,
  tblJobWorkLog.ChargeableTime,
  CASE WHEN WorkLogJobTypeID in 
  ('FA5E6979-D228-44B7-A91B-8DDC8DDC709B', '3171B295-60E9-4724-95A3-04FA182D7D43', 
   '52c2691f-ff0a-4263-a440-8a309f868f93') THEN 1 END chk1,
  CASE WHEN WorkLogJobTypeID in 
    ('D0E910B1-B4BD-430C-AD04-EB4E67946806', 'B0BBF362-294D-4262-BED8-EDA7EE74745B', 
     '1E333ADC-E4F2-4042-8B65-E25F2770D59F', 'A445B7CE-E9E4-48E6-B5AA-83C83F045315', 
     '1D83F510-87FA-446E-9337-3D0376210D57', 'B59C1596-E1D0-4118-A805-65208E27AFB5', 
     'F44A4B3C-B149-45A8-A9F0-5A57883482FD') THEN 1 END chk2
FROM
       tblJobWorkLog
       INNER JOIN tblJob ON tblJobWorkLog.JobID = tblJob.JobID
       INNER JOIN tblContact ON tblJob.ContactID = tblContact.ContactID
WHERE
       tblJobWorkLog.StartTime >= '20150511'
       AND tblJobWorkLog.EndTime <= '20150515'
       AND SystemUserID = '65405273-6BFD-4482-8A0D-BC6430AC996D'
)
SELECT
       FromDate,
       SUM(chk1 * JobTime) / 60.0 as SupportHoursWorked,
       SUM(chk1 * ChargeableTime) AS SupportHoursCharged,
       SUM(chk2 * JobTime) / 60.0 as DevelopmentHoursWorked,
       SUM(chk2 * ChargeableTime) as DevelopmentHoursCharged
FROM
       cte
GROUP BY FromDate
ORDER BY FromDate