2013-05-29 43 views
1

该存储过程结果存储在总共查询的基础上,如果总共没有任何记录 那么结果就要0,如何管理空值。数据透视表在存储过程中使用视图管理空值

CREATE PROCEDURE dbo.Procedure_Summary 
    @UserID INT , 
    @Year INT  
AS 
BEGIN 

/* Procedure body */ 

SELECT UserID, 
     UserName , 
     [Marks1] as 'English', 
     [Marks2] as 'Maths', 
     [Marks3] as 'Science' 
FROM 
    ( 
     SELECT l.UserID, 
       e.UserName , 
       s.SubjectName, 
       TotalMarks AS Total 
     FROM ViewLeave l 
      INNER JOIN SubjectType s ON s.SubjectID = l.SubjectID 
      INNER JOIN UserInfo e ON e.UserID = l.UserID 
     WHERE ((l.Result = 'Pass') 
       AND (e.UserID = @UserID) 
       AND l.[year][email protected]) 
     GROUP BY s.SubjectName,l.UserID, e.UserName ,TotalDays 
    )ps 
    pivot 
    (
     SUM(Total) 
     FOR SubjectName IN ([Marks1],[Marks2],[Marks3]) 
    ) AS pvt   

END 

当前结果和预期的结果是因为 -

Accoding to current stored procedure result are as , 

UserID   UserName English  Maths  Science 
105     ABC  25  0  36 
106     XYZ  26  88  88 

But i want if all three subject marks are 0 means total are zero and then show 
as , also show non zero record 


UserID   UserName English  Maths  Science 
109     QWE   0  0  0 
+0

您可以发布为每个表和所期望的结果一些数据?将'INNER JOIN'改为'LEFT JOIN'可能就足够了。 – Taryn

+0

LEFT JOIN尝试过,但没有得到任何结果 –

+0

我的建议是发布一些样本数据和期望的结果。或者更好的方式是用工作数据模型创建一个[sql小提琴](http://sqlfiddle.com)。 – Taryn

回答

0
 CREATE PROCEDURE dbo.Procedure_Summary @UserID INT , @Year INT AS BEGIN 

      /* Procedure body */ 
      SELECT UserID, UserName , [Marks1] as 'English', 
       [Marks2] as 'Maths', 
       [Marks3] as 'Science' FROM 
    (SELECT l.UserID, e.UserName , s.SubjectName, 
    case when l.Result = 'Pass' 
    then l.TotalMarks 
    else 0 end AS Total 
     from UserInfo e 
LEFT JOIN ViewLeave l ON e.UserID = l.UserID 
    LEFT JOIN SubjectType s ON s.SubjectID = l.SubjectID  

       Where e.UserID = @UserD AND 
       [email protected] 
       GROUP BY s.SubjectName,l.UserID, e.UserName ,TotalDays 
      )ps 
      pivot 
      (
       SUM(Total) 
       FOR SubjectName IN ([Marks1],[Marks2],[Marks3]) 
      ) AS pvt   

     END 
1

尝试这一个 -

CREATE PROCEDURE dbo.Procedure_Summary 

    @UserID INT , 
    @Year INT  

AS BEGIN 

    SELECT 
      UserID 
     , UserName 
     , [English] = [Marks1] 
     , [Maths] = [Marks2] 
     , [Science] = [Marks3] 
    FROM 
    ( 
     SELECT 
       l.UserID 
      , e.UserName 
      , s.SubjectName 
      , Total = ISNULL(TotalMarks, 0) 
     FROM dbo.ViewLeave l 
     LEFT JOIN dbo.SubjectType s ON s.SubjectID = l.SubjectID 
     LEFT JOIN dbo.UserInfo e ON e.UserID = l.UserID 
     WHERE l.Result = 'Pass' 
      AND e.UserID = @UserID 
      AND l.[year] = @Year 
     GROUP BY 
       s.SubjectName 
      , l.UserID 
      , e.UserName 
      , TotalDays 
    ) ps 
    PIVOT 
    (
     SUM(Total) 
     FOR SubjectName In ([Marks1],[Marks2],[Marks3]) 
    ) pvt   

END 
+0

总共没有得到0 –

+0

请提供您的表格的一些样本数据。 – Devart

+0

检查更新后的问题.. –

1

这是很难完全回答这个问题,因为表的细节并不是很好。

你可以尝试运行与要传递给看看是否有任何数据被返回的用户你的内部查询:

SELECT l.UserID, 
    e.UserName , 
    s.SubjectName, 
    TotalMarks AS Total 
FROM ViewLeave l 
INNER JOIN SubjectType s ON s.SubjectID = l.SubjectID 
INNER JOIN UserInfo e ON e.UserID = l.UserID 
WHERE ((l.Result = 'Pass') 
    AND (e.UserID = @UserID) 
    AND l.[year][email protected]) 
GROUP BY s.SubjectName,l.UserID, e.UserName ,TotalDays -- I am not sure why you have this group by 

我猜测的问题的一部分是要加入的方式。您正在使用内部联接,这将要求每个表中都存在行,但用户正在被UserInfo表过滤。所以我会提出以下更改。

更改您的连接来LEFT JOIN的,使第一表连接是UserInfo表,这样的代码将是:

CREATE PROCEDURE dbo.Procedure_Summary 
    @UserID INT , 
    @Year INT  
AS 
BEGIN 

/* Procedure body */ 

SELECT UserID, 
     UserName , 
     [Marks1] as 'English', 
     [Marks2] as 'Maths', 
     [Marks3] as 'Science' 
FROM 
    ( 
     SELECT l.UserID, 
       e.UserName , 
       s.SubjectName, 
       TotalMarks AS Total 
     FROM UserInfo e 
     LEFT JOIN ViewLeave l 
      ON e.UserID = l.UserID 
      AND l.Result = 'Pass' 
      AND l.[year][email protected] 
     LEFT JOIN SubjectType s 
      ON s.SubjectID = l.SubjectID 
     WHERE e.UserID = @UserID 
    )ps 
    pivot 
    (
     SUM(Total) 
     FOR SubjectName IN ([Marks1],[Marks2],[Marks3]) 
    ) AS pvt   

END 
+0

通过检查案件解决问题..看到答案 –

相关问题