我有以下代码,我用于查询CMMS系统数据库以了解报告原因。如果我删除Group by
它将运行,但它会计算Where
语句返回的所有运行。我猜是因为我没有使用Group By
语句。当我添加它时,我收到以下错误:
子查询返回的值超过1。当子查询遵循=,!=,<,< =,>,> =或子查询用作表达式时,不允许这样做。
如果有任何身体可以指向正确的方向,那就太棒了。
USE [Maint5k]
GO
/****** Object: StoredProcedure [dbo].[PMs_Past_Due_Count] Script Date: 3/21/2017 11:08:52 AM ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author: <Hicks,Clayton>
-- Create date: <2017,03,06>
-- Description: <Pulls open Maintennace Reactive Work Orders for the current week>
-- =============================================
ALTER PROCEDURE [dbo].[PMs_Past_Due_Count]
as
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;
-- Insert statements for procedure here
SELECT
woJob.JobID
,woJob.FullDescription
,woJob.DueDate
,syJobType.Code AS [syJobType Code]
,syJobStatus.Code AS [syJobStatus Code]
,emLabour.LabourFirstName AS [First Name]
,emLabour.LabourSurName AS [Last Name]
,wojob.LabourID
,(Select count(wojob.LabourID) as 'Count_LabourID' from woJob
INNER JOIN syJobType
ON woJob.JobTypeID = syJobType.JobTypeID
INNER JOIN syJobStatus
ON woJob.JobStatusID = syJobStatus.JobStatusID
INNER JOIN [Maint5k].[dbo].[emLabour]
ON woJob.LabourID = emLabour.LabourID
Where syJobType.Code = 'PM' and
DueDate < GETDATE() and
(syjobstatus.Code = 'Open' or
syJobStatus.Code = 'SCHEDULED')
group by wojob.LabourID) as CountLabourIDs
FROM
woJob
INNER JOIN syJobType
ON woJob.JobTypeID = syJobType.JobTypeID
INNER JOIN syJobStatus
ON woJob.JobStatusID = syJobStatus.JobStatusID
INNER JOIN [Maint5k].[dbo].[emLabour]
ON woJob.LabourID = emLabour.LabourID
Where syJobType.Code = 'PM' and
DueDate < GETDATE() and
(syjobstatus.Code = 'Open' or
syJobStatus.Code = 'SCHEDULED')
'
答案 0 :(得分:0)
试试这个..请查看脚本中的评论
SELECT
wojob1.JobID
,wojob1.FullDescription
,wojob1.DueDate
,syJobType.Code AS [syJobType Code]
,syJobStatus.Code AS [syJobStatus Code]
,emLabour.LabourFirstName AS [First Name]
,emLabour.LabourSurName AS [Last Name]
,wojob1.LabourID
,(Select count(1) from woJob -- replaced
INNER JOIN syJobType s1 --- alias
ON woJob.JobTypeID = s1.JobTypeID
INNER JOIN syJobStatus s2 --- alias
ON woJob.JobStatusID = s2.JobStatusID
INNER JOIN [Maint5k].[dbo].[emLabour] em --- alias
ON woJob.LabourID = em.LabourID
and wojob1.LabourID = woJob.LabourID --added
Where syJobType.Code = 'PM' and
DueDate < GETDATE() and
(syjobstatus.Code = 'Open' or
syJobStatus.Code = 'SCHEDULED')
-- group by wojob.LabourID -- removed
) as CountLabourIDs
FROM
woJob as wojob1 -- alias
INNER JOIN syJobType
ON wojob1.JobTypeID = syJobType.JobTypeID
INNER JOIN syJobStatus
ON wojob1.JobStatusID = syJobStatus.JobStatusID
INNER JOIN [Maint5k].[dbo].[emLabour]
ON wojob1.LabourID = emLabour.LabourID
Where syJobType.Code = 'PM' and
DueDate < GETDATE() and
(syjobstatus.Code = 'Open' or
syJobStatus.Code = 'SCHEDULED')
答案 1 :(得分:0)
试试此代码
-- Insert statements for procedure here
With My_cte as (
Select wojob.LabourID,count(wojob.LabourID) as Count_LabourID
FROM woJob
INNER JOIN syJobType
ON woJob.JobTypeID = syJobType.JobTypeID
INNER JOIN syJobStatus
ON woJob.JobStatusID = syJobStatus.JobStatusID
INNER JOIN [Maint5k].[dbo].[emLabour]
ON woJob.LabourID = emLabour.LabourID
Where syJobType.Code = 'PM' and
DueDate < GETDATE() and
(syjobstatus.Code = 'Open' or
syJobStatus.Code = 'SCHEDULED')
group by wojob.LabourID
)
SELECT
woJob.JobID
,woJob.FullDescription
,woJob.DueDate
,syJobType.Code AS [syJobType Code]
,syJobStatus.Code AS [syJobStatus Code]
,emLabour.LabourFirstName AS [First Name]
,emLabour.LabourSurName AS [Last Name]
,wojob.LabourID
,Count_LabourID
FROM
woJob
INNER JOIN syJobType
ON woJob.JobTypeID = syJobType.JobTypeID
INNER JOIN syJobStatus
ON woJob.JobStatusID = syJobStatus.JobStatusID
INNER JOIN [Maint5k].[dbo].[emLabour]
ON woJob.LabourID = emLabour.LabourID
LEFT JOIN My_cte e on wojob.LabourID = e.wojob.LabourID
Where syJobType.Code = 'PM' and
DueDate < GETDATE() and
(syjobstatus.Code = 'Open' or
syJobStatus.Code = 'SCHEDULED')
答案 2 :(得分:0)
你使用相同的连接/两次,这可能与组计数相同:
SELECT
woJob.JobID
,woJob.FullDescription
,woJob.DueDate
,syJobType.Code AS [syJobType Code]
,syJobStatus.Code AS [syJobStatus Code]
,emLabour.LabourFirstName AS [First Name]
,emLabour.LabourSurName AS [Last Name]
,wojob.LabourID
,count(*) over (partition by wojob.LabourID) as CountLabourIDs
FROM
woJob
INNER JOIN syJobType
ON woJob.JobTypeID = syJobType.JobTypeID
INNER JOIN syJobStatus
ON woJob.JobStatusID = syJobStatus.JobStatusID
INNER JOIN [Maint5k].[dbo].[emLabour]
ON woJob.LabourID = emLabour.LabourID
Where syJobType.Code = 'PM' and
DueDate < GETDATE() and
(syjobstatus.Code = 'Open' or
syJobStatus.Code = 'SCHEDULED')