Group By Statement给出错误

时间:2017-03-21 22:03:14

标签: sql sql-server count group-by subquery

我有以下代码,我用于查询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') 
'

3 个答案:

答案 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')