0

私は次のようなストアドプロシージャを持っています:

ALTER PROCEDURE [dbo].[Driverperformance] 
      @Ecode NVARCHAR(50), 
      @startdate DATETIME, 
      @enddate DATETIME 
AS  

      BEGIN 
      DECLARE @date1 DATETIME = CONVERT(DATETIME, @startdate + ' 00:01:00.000', 120); 
      DECLARE @date2 DATETIME = CONVERT(DATETIME, @enddate + ' 23:23:59.000', 120) ; 

      SELECT 
          e.ecode,   
          Cast(q.dtime AS DATE) AS Date,   
          e.ename, 
          Count(q.ecode) cntEcode   
     FROM employeemaster_tbl e JOIN transaction_tbl q ON e.ecode = q.ecode 
     WHERE  
          q.ecode = @Ecode     
          AND dtime >= '' + @date1 + ''   
          AND dtime <= '' + @date2 + '' 
     GROUP BY 
          e.ecode,  
          e.ename,   
          Cast(q.dtime AS DATE)  

     SELECT 
          e.ecode, 
          Cast(q.dtime AS DATE) AS Date, 
          e.ename, 
          Count(q.delecode)     DelEcode 
     FROM employeemaster_tbl e JOIN transaction_tbl q ON e.ecode = q.delecode  
     WHERE 
          q.delecode = @Ecode 
          AND dtime >= '' + @date1 + '' 
          AND dtime <= '' + @date2 + '' 
     GROUP BY 
          e.ecode, 
          e.ename,   
          Cast(q.dtime AS DATE) 
     ORDER  BY Cast(q.dtime AS DATE) 
  END

私は最初の結果を得ています:

Ecode   Date         Ename    CntEcode  
E003    2013-05-05   Raheem    4                    
E003    2013-05-28   Raheem    1 

2 番目の結果:

Ecode   Date         Ename    CntEcode  
E003    2013-05-05   Raheem    3         
E003    2013-05-27   Raheem    7           
E003    2013-05-28   Raheem    1

しかし、私は次のような1つの結果に出たいと思っています:

Ecode   Date         Ename    CntEcode   DelEcode
E003    2013-05-05   Raheem    4            3
E003    2013-05-27   Raheem    0            7
E003    2013-05-28   Raheem    1            1

どうすればこれを達成できますか?誰かが知っているなら、私が見つけるのを手伝ってください。

4

2 に答える 2

1

最初の部分で TI が投稿したものを使用します。

WITH firstResult AS
(
SELECT 
      e.ecode,   
      Cast(q.dtime AS DATE) AS DateAdded,   
      e.ename, 
      Count(q.ecode) cntEcode   
 FROM employeemaster_tbl e JOIN transaction_tbl q ON e.ecode = q.ecode 
 WHERE  
      q.ecode = @Ecode     
      AND dtime >= '' + @date1 + ''   
      AND dtime <= '' + @date2 + '' 
 GROUP BY 
      e.ecode,  
      e.ename,   
      Cast(q.dtime AS DATE)  
), 
secondResult AS
(
 SELECT 
      e.ecode, 
      Cast(q.dtime AS DATE) AS DateAdded, 
      e.ename, 
      Count(q.delecode) as DelEcode 
 FROM employeemaster_tbl e JOIN transaction_tbl q ON e.ecode = q.delecode  
 WHERE 
      q.delecode = @Ecode 
      AND dtime >= '' + @date1 + '' 
      AND dtime <= '' + @date2 + '' 
 GROUP BY 
      e.ecode, 
      e.ename,   
      Cast(q.dtime AS DATE) 
)

ただし、Ecode、DateAdded、および EName にも ISNULL を使用します。これは、完全な結合があり、secondResult テーブルの値が null になる可能性があるためです。

select ISNULL(firstResult.Ecode,secondResult.Ecode) as Ecode,ISNULL(firstResult.DateAdded,secondResult.DateAdded) as DateAdded,  
    ISNULL(firstResult.Ename,secondResult.Ename) as Ename, ISNULL(firstResult.EntEcode,0) as Ecode, ISNULL(secondResult.DelEcode,0) as DelEcode
    from
    firstResult full outer join secondResult on firstResult.Ecode = secondResult.Ecode and firstResult.DateAdded = secondResult.DateAdded
    order by DateAdded
于 2013-09-05T09:37:08.700 に答える
0

どちらのテーブルからも日付が欠落しているように見えるため、 のFULL JOIN方が適切であり、その日のカウントが null の場合ISNULLに取得するために使用されます0

試す:

; WITH cnt AS
(
SELECT 
      e.ecode,   
      Cast(q.dtime AS DATE) AS Date,   
      e.ename, 
      Count(q.ecode) cntEcode   
 FROM employeemaster_tbl e JOIN transaction_tbl q ON e.ecode = q.ecode 
 WHERE  
      q.ecode = @Ecode     
      AND dtime >= '' + @date1 + ''   
      AND dtime <= '' + @date2 + '' 
 GROUP BY 
      e.ecode,  
      e.ename,   
      Cast(q.dtime AS DATE)  
), 
del AS
(
 SELECT 
      e.ecode, 
      Cast(q.dtime AS DATE) AS Date, 
      e.ename, 
      Count(q.delecode)     DelEcode 
 FROM employeemaster_tbl e JOIN transaction_tbl q ON e.ecode = q.delecode  
 WHERE 
      q.delecode = @Ecode 
      AND dtime >= '' + @date1 + '' 
      AND dtime <= '' + @date2 + '' 
 GROUP BY 
      e.ecode, 
      e.ename,   
      Cast(q.dtime AS DATE) 
)

SELECT ISNULL(del.ecode, ctn.ecode) ecode
       , ISNULL(del.[Date], cnt.[Date]) [Date]
       , ISNULL(del.ename, cnt.ename) ename
       , ISNULL(cnt.cntEcode, 0) CntEcode
       , ISNULL(del.cntEcode, 0) AS DelEcode
FROM cnt
FULL JOIN del ON del.ecode = cnt.ecode
             AND del.[Date] = cnt.[Date]
             AND del.Ename = cnt.Ename
于 2013-09-05T09:26:33.823 に答える