2017-03-21 26 views
0

私は以下のコードを持っていますが、私は報告の理由からCMMSシステムデータベースに問い合わせています。 Group byを削除すると、実行されますが、Whereステートメントによって返されたすべての実行がカウントされます。私はそれがGroup Byステートメントを使用していないためだと推測しています。すべてのボディは素晴らしいことだ正しい方向に私を指すことができる場合グループBy Statementエラー

Subquery returned more than 1 value. This is not permitted when the subquery follows =, !=, <, <= , >, >= or when the subquery is used as an expression.

:私は私にそれを追加すると、次のエラーを取得します。

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

wojobの下に複数のグループがあり、それらを数えると、基本的にグループ全体の数が全体の数になりますので、エラーは正しいです... – maSTAShuFu

+0

サブクエリの目標は何ですか? – maSTAShuFu

+0

これは*グループカウント*を取得する複雑な方法ですが、代わりに 'count(*)over(partition by wojob.LabourID)'を試してみてください。 – dnoeth

答えて

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') 
+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') 
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')