我怎样才能结合这两个存储过程
How can I combine these two stored procedures
我正在尝试合并这两个存储过程,以便returns它们各自的值headings/columns所以结果如下"Support Hours Worked""Support Hours Charged" "Development Hours Worked" 和 "Development Hours Charged"
查询一
USE [Database]
GO
/****** Object: StoredProcedure [dbo].[usp_JobTimeSystem_FetchSupport] ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [dbo].[usp_JobTimeSystem_FetchSupport]
@FromDate datetime,
@ToDate datetime,
@SystemUserID uniqueidentifier
AS
;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
FROM
tblJobWorkLog
INNER JOIN tblJob ON tblJobWorkLog.JobID = tblJob.JobID
INNER JOIN tblContact ON tblJob.ContactID = tblContact.ContactID
WHERE
tblJobWorkLog.StartTime >= @FromDate
AND tblJobWorkLog.EndTime <= @ToDate
AND (WorkLogJobTypeID = 'FA5E6979-D228-44B7-A91B-8DDC8DDC709B' OR WorkLogJobTypeID = '3171B295-60E9-4724-95A3-04FA182D7D43' OR WorkLogJobTypeID = '52c2691f-ff0a-4263-a440-8a309f868f93')
AND SystemUserID = @SystemUserID
)
SELECT
FromDate,
(SUM(JobTime) / 60.0) HoursWorked,
SUM(ChargeableTime) AS HoursCharged
FROM
cte
GROUP BY
FromDate
ORDER BY
FromDate
查询二
USE [Database]
GO
/****** Object: StoredProcedure [dbo].[usp_JobTimeSystem_FetchDevelopment] Script Date: 18/05/2015 09:23:53 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [dbo].[usp_JobTimeSystem_FetchDevelopment]
@FromDate datetime,
@ToDate datetime,
@SystemUserID uniqueidentifier
AS
;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
FROM
tblJobWorkLog
INNER JOIN tblJob ON tblJobWorkLog.JobID = tblJob.JobID
INNER JOIN tblContact ON tblJob.ContactID = tblContact.ContactID
WHERE
tblJobWorkLog.StartTime >= @FromDate
AND tblJobWorkLog.EndTime <= @ToDate
AND (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')
AND SystemUserID = @SystemUserID
)
SELECT
FromDate,
(SUM(JobTime) / 60.0) HoursWorked,
SUM(ChargeableTime) AS HoursCharged
FROM
cte
GROUP BY
FromDate
ORDER BY
FromDate
我知道肯定有办法将它们组合在一起,但我几周前才开始 SQL,我真的不知道该怎么做,一些指点甚至意义重大,谢谢。
欢迎来到SQL的精彩世界!希望下面的代码能帮助你。
基本上使用两个查询之间的公共 select 创建一个查询,并使用 case 语句从两个查询中进一步过滤出您想要的唯一结果:
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
FROM
tblJobWorkLog
INNER JOIN tblJob ON tblJobWorkLog.JobID = tblJob.JobID
INNER JOIN tblContact ON tblJob.ContactID = tblContact.ContactID
WHERE
tblJobWorkLog.StartTime >= @FromDate
AND tblJobWorkLog.EndTime <= @ToDate
AND SystemUserID = @SystemUserID
)
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
您可以在一个查询中定义 2 个 CTE,然后像这样在 UserID 上将它们连接起来:
USE [Database]
GO
/****** Object: StoredProcedure [dbo].[usp_JobTimeSystem_FetchSupport] ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE PROCEDURE [dbo].[usp_JobTimeSystem]
@FromDate datetime,
@ToDate datetime,
@SystemUserID uniqueidentifier
AS
;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
FROM
tblJobWorkLog
INNER JOIN tblJob ON tblJobWorkLog.JobID = tblJob.JobID
INNER JOIN tblContact ON tblJob.ContactID = tblContact.ContactID
WHERE
tblJobWorkLog.StartTime >= @FromDate
AND tblJobWorkLog.EndTime <= @ToDate
AND (WorkLogJobTypeID = 'FA5E6979-D228-44B7-A91B-8DDC8DDC709B' OR WorkLogJobTypeID = '3171B295-60E9-4724-95A3-04FA182D7D43' OR WorkLogJobTypeID = '52c2691f-ff0a-4263-a440-8a309f868f93')
AND SystemUserID = @SystemUserID
)
, cte2 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
FROM
tblJobWorkLog
INNER JOIN tblJob ON tblJobWorkLog.JobID = tblJob.JobID
INNER JOIN tblContact ON tblJob.ContactID = tblContact.ContactID
WHERE
tblJobWorkLog.StartTime >= @FromDate
AND tblJobWorkLog.EndTime <= @ToDate
AND (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')
AND SystemUserID = @SystemUserID
)
SELECT
a.FromDate,
(SUM(a.JobTime) / 60.0) SupportHoursWorked,
SUM(a.ChargeableTime) AS SupportHoursCharged,
(SUM(b.JobTime) / 60.0) DevelopmentHoursWorked,
SUM(b.ChargeableTime) AS DevelopmentHoursCharged
FROM
cte as a
JOIN
cte2 as b
ON
a.SystemUserID=b.SystemUserID
GROUP BY
a.FromDate
ORDER BY
a.FromDate
但显然没有测试数据,我只能根据您在此处向我们展示的内容猜测这是否可行。
将输出合并到一个使用现有例程的新程序中,如果您需要更改程序,则维护工作更少。
CREATE PROCEDURE dbo.FetchHours
@FromDate datetime,
@ToDate datetime,
@SystemUserID uniqueidentifier
AS
EXEC [dbo].[usp_JobTimeSystem_FetchSupport] @FromDate, @ToDate, @SystemUserID;
EXEC [dbo].[usp_JobTimeSystem_FetchDevelopment] @FromDate, @ToDate, @SystemUserID;
GO
如果您的存储过程 return 结果集,您可以将结果保存到临时 table(如评论中提到的@ughai)。
类似(我不确定语法是否正确):
INSERT INTO #temp1
FROM
EXEC [dbo].[usp_JobTimeSystem_FetchSupport] @FromDate, @ToDate, @SystemUserID;
第二个查询相同:
INSERT INTO #temp2
FROM
EXEC [dbo].[usp_JobTimeSystem_FetchDevelopment] @FromDate, @ToDate,
@SystemUserID;
然后您可以编写一个新的 SELECT
查询来合并上面的结果。
最好是在单独的存储过程中关闭所有内容。
两个临时 table 都应在使用前创建。
一些伪代码:
CREATE PROCEDURE dbo.FetchHours
@FromDate datetime,
@ToDate datetime,
@SystemUserID uniqueidentifier
AS
CREATE TABLE #temp1...
CREATE TABLE #temp2...
INSERT INTO #temp1
FROM
EXEC [dbo].[usp_JobTimeSystem_FetchSupport] @FromDate, @ToDate, @SystemUserID;
INSERT INTO #temp2
FROM
EXEC [dbo].[usp_JobTimeSystem_FetchDevelopment] @FromDate, @ToDate,
@SystemUserID;
SELECT your columns
FROM #temp1 JOIN #temp2 ON ...
ORDER BY ...
GO
如果您的数据不是太大(超过数千行),您可以使用变量 table 而不是临时变量 table。
我正在尝试合并这两个存储过程,以便returns它们各自的值headings/columns所以结果如下"Support Hours Worked""Support Hours Charged" "Development Hours Worked" 和 "Development Hours Charged"
查询一
USE [Database]
GO
/****** Object: StoredProcedure [dbo].[usp_JobTimeSystem_FetchSupport] ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [dbo].[usp_JobTimeSystem_FetchSupport]
@FromDate datetime,
@ToDate datetime,
@SystemUserID uniqueidentifier
AS
;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
FROM
tblJobWorkLog
INNER JOIN tblJob ON tblJobWorkLog.JobID = tblJob.JobID
INNER JOIN tblContact ON tblJob.ContactID = tblContact.ContactID
WHERE
tblJobWorkLog.StartTime >= @FromDate
AND tblJobWorkLog.EndTime <= @ToDate
AND (WorkLogJobTypeID = 'FA5E6979-D228-44B7-A91B-8DDC8DDC709B' OR WorkLogJobTypeID = '3171B295-60E9-4724-95A3-04FA182D7D43' OR WorkLogJobTypeID = '52c2691f-ff0a-4263-a440-8a309f868f93')
AND SystemUserID = @SystemUserID
)
SELECT
FromDate,
(SUM(JobTime) / 60.0) HoursWorked,
SUM(ChargeableTime) AS HoursCharged
FROM
cte
GROUP BY
FromDate
ORDER BY
FromDate
查询二
USE [Database]
GO
/****** Object: StoredProcedure [dbo].[usp_JobTimeSystem_FetchDevelopment] Script Date: 18/05/2015 09:23:53 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [dbo].[usp_JobTimeSystem_FetchDevelopment]
@FromDate datetime,
@ToDate datetime,
@SystemUserID uniqueidentifier
AS
;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
FROM
tblJobWorkLog
INNER JOIN tblJob ON tblJobWorkLog.JobID = tblJob.JobID
INNER JOIN tblContact ON tblJob.ContactID = tblContact.ContactID
WHERE
tblJobWorkLog.StartTime >= @FromDate
AND tblJobWorkLog.EndTime <= @ToDate
AND (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')
AND SystemUserID = @SystemUserID
)
SELECT
FromDate,
(SUM(JobTime) / 60.0) HoursWorked,
SUM(ChargeableTime) AS HoursCharged
FROM
cte
GROUP BY
FromDate
ORDER BY
FromDate
我知道肯定有办法将它们组合在一起,但我几周前才开始 SQL,我真的不知道该怎么做,一些指点甚至意义重大,谢谢。
欢迎来到SQL的精彩世界!希望下面的代码能帮助你。
基本上使用两个查询之间的公共 select 创建一个查询,并使用 case 语句从两个查询中进一步过滤出您想要的唯一结果:
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
FROM
tblJobWorkLog
INNER JOIN tblJob ON tblJobWorkLog.JobID = tblJob.JobID
INNER JOIN tblContact ON tblJob.ContactID = tblContact.ContactID
WHERE
tblJobWorkLog.StartTime >= @FromDate
AND tblJobWorkLog.EndTime <= @ToDate
AND SystemUserID = @SystemUserID
)
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
您可以在一个查询中定义 2 个 CTE,然后像这样在 UserID 上将它们连接起来:
USE [Database]
GO
/****** Object: StoredProcedure [dbo].[usp_JobTimeSystem_FetchSupport] ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE PROCEDURE [dbo].[usp_JobTimeSystem]
@FromDate datetime,
@ToDate datetime,
@SystemUserID uniqueidentifier
AS
;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
FROM
tblJobWorkLog
INNER JOIN tblJob ON tblJobWorkLog.JobID = tblJob.JobID
INNER JOIN tblContact ON tblJob.ContactID = tblContact.ContactID
WHERE
tblJobWorkLog.StartTime >= @FromDate
AND tblJobWorkLog.EndTime <= @ToDate
AND (WorkLogJobTypeID = 'FA5E6979-D228-44B7-A91B-8DDC8DDC709B' OR WorkLogJobTypeID = '3171B295-60E9-4724-95A3-04FA182D7D43' OR WorkLogJobTypeID = '52c2691f-ff0a-4263-a440-8a309f868f93')
AND SystemUserID = @SystemUserID
)
, cte2 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
FROM
tblJobWorkLog
INNER JOIN tblJob ON tblJobWorkLog.JobID = tblJob.JobID
INNER JOIN tblContact ON tblJob.ContactID = tblContact.ContactID
WHERE
tblJobWorkLog.StartTime >= @FromDate
AND tblJobWorkLog.EndTime <= @ToDate
AND (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')
AND SystemUserID = @SystemUserID
)
SELECT
a.FromDate,
(SUM(a.JobTime) / 60.0) SupportHoursWorked,
SUM(a.ChargeableTime) AS SupportHoursCharged,
(SUM(b.JobTime) / 60.0) DevelopmentHoursWorked,
SUM(b.ChargeableTime) AS DevelopmentHoursCharged
FROM
cte as a
JOIN
cte2 as b
ON
a.SystemUserID=b.SystemUserID
GROUP BY
a.FromDate
ORDER BY
a.FromDate
但显然没有测试数据,我只能根据您在此处向我们展示的内容猜测这是否可行。
将输出合并到一个使用现有例程的新程序中,如果您需要更改程序,则维护工作更少。
CREATE PROCEDURE dbo.FetchHours
@FromDate datetime,
@ToDate datetime,
@SystemUserID uniqueidentifier
AS
EXEC [dbo].[usp_JobTimeSystem_FetchSupport] @FromDate, @ToDate, @SystemUserID;
EXEC [dbo].[usp_JobTimeSystem_FetchDevelopment] @FromDate, @ToDate, @SystemUserID;
GO
如果您的存储过程 return 结果集,您可以将结果保存到临时 table(如评论中提到的@ughai)。
类似(我不确定语法是否正确):
INSERT INTO #temp1
FROM
EXEC [dbo].[usp_JobTimeSystem_FetchSupport] @FromDate, @ToDate, @SystemUserID;
第二个查询相同:
INSERT INTO #temp2
FROM
EXEC [dbo].[usp_JobTimeSystem_FetchDevelopment] @FromDate, @ToDate,
@SystemUserID;
然后您可以编写一个新的 SELECT
查询来合并上面的结果。
最好是在单独的存储过程中关闭所有内容。
两个临时 table 都应在使用前创建。
一些伪代码:
CREATE PROCEDURE dbo.FetchHours
@FromDate datetime,
@ToDate datetime,
@SystemUserID uniqueidentifier
AS
CREATE TABLE #temp1...
CREATE TABLE #temp2...
INSERT INTO #temp1
FROM
EXEC [dbo].[usp_JobTimeSystem_FetchSupport] @FromDate, @ToDate, @SystemUserID;
INSERT INTO #temp2
FROM
EXEC [dbo].[usp_JobTimeSystem_FetchDevelopment] @FromDate, @ToDate,
@SystemUserID;
SELECT your columns
FROM #temp1 JOIN #temp2 ON ...
ORDER BY ...
GO
如果您的数据不是太大(超过数千行),您可以使用变量 table 而不是临时变量 table。