2017-11-19 10 views
0

私はマネージャーとそれらに報告するすべての人の合計売上を返すストアドプロシージャを作成しています。売上高がない場合は合計ゼロを返しますが、一定期間内に売上がない場合は現在何も返されません。0を返しません0

CREATE PROCEDURE prc_ManagerTotalSales @managerID INT, 
            @beginDate DATE, 
            @endDate DATE, 
          @group VARCHAR(15) = 'total' 

AS 
BEGIN 

SELECT   
    FirstName + ' ' + e.LastName AS Name,   
    COALESCE(SUM(od.UnitPrice * od.Quantity), 0) AS TotalSales 
FROM 
    dbo.Employees e 
    LEFT OUTER JOIN dbo.Orders o ON e.EmployeeID = o.EmployeeID 
    LEFT OUTER JOIN dbo.[Order Details] od ON o.OrderID = od.OrderID 
WHERE 
    (e.EmployeeID = @managerID OR e.ReportsTo = @managerID) 
    AND o.OrderDate >= @beginDate 
    AND o.OrderDate <= @endDate        
GROUP BY 
    e.FirstName, 
    e.LastName      
END 
+1

あなたの 'where'は、注文をしていない従業員を除外します。結合に条件を追加します(特に 'o.OrderDate')。 – Caramiriel

答えて

0

あなたはこれを試すことができます。

SELECT   
     FirstName + ' ' + e.LastName AS Name,   
     COALESCE(SUM(od.UnitPrice * od.Quantity), 0) AS TotalSales 
    FROM 
     dbo.Employees e 
     LEFT OUTER JOIN dbo.Orders o ON e.EmployeeID = o.EmployeeID 
      AND o.OrderDate >= @beginDate 
      AND o.OrderDate <= @endDate 
     LEFT OUTER JOIN dbo.[Order Details] od ON o.OrderID = od.OrderID 
    WHERE 
     (e.EmployeeID = @managerID OR e.ReportsTo = @managerID) 
    GROUP BY 
     e.FirstName, 
     e.LastName 
+0

はい、これは私が上記のコメントに応じて思いついたものです。ありがとうございました! – VinPropane

0

問題がgroup byです。 。 。条件に一致する行がない場合、行は戻されません。

一つの方法は次のとおりです。

with g as (
     <your query here> 
    ) 
select g.* 
from g 
union all 
select name, totalsales 
from (select NULL as name, 0 as totalsales) x 
where not exists (select 1 from g); 
関連する問題