即使是null sql server也返回行数

时间:2014-04-25 01:36:21

标签: sql sql-server

我尝试执行sql查询以获取每个用户的移位计数 我使用了这个查询:

SELECT        
   COUNT(s.id) AS count, s.user_id
FROM            
   sarcuser AS u 
INNER JOIN
   sarcshiftpointuser AS s ON s.user_id = u.id 
INNER JOIN
   sarcalllevel AS l ON l.id = u.levelid 
INNER JOIN
   sarcshiftpointtable AS t ON t.shift_id = s.shift_id AND s.table_id = t.table_id
WHERE        
   (s.shift_id + '' LIKE '2') 
   AND (CAST(s.xdate AS DATE) BETWEEN CAST(N'2014-01-01' AS DATE) AND CAST(N'2015-01-01' AS DATE)) 
   AND (u.gender + '' LIKE N'%') 
   AND (u.levelid + '' LIKE N'%') 
   AND (s.point_id + '' LIKE '2')
GROUP BY 
   s.user_id
ORDER BY 
   count

它运作良好......但存在逻辑问题:

当用户没有出现在班次时没有返回计数而我需要它返回0

例如:

           user1    user2
shift1      2         2
shift2      5         0
shift3      6         10

但实际上代码返回:

           user1    user2
shift1      2         2
shift2      5         10
shift3      6         

那是错的......即使这个条件和这个内部联接为零,如何返回计数呢?

表中数据的示例:

sarcuser : 
    id  firstname   lastname   gender   levelid 
    52    samy       sammour    male       1
    62    ibrahim      jackob   male       1
    71    rebeca       janson   female     3

sarcalllevel :
    id    name
    1     field leader
    2       leader
    3       paramdic

sarcshiftpointtable : 
    id    shift_id    table_id    name_of_shift    point_id
    1        1           1              shift1         2
    2        2           1              shift2         2
    3        3           1              shift3         2
    4        1           2              shift1         7
    5        2           2              shift2         7
    6        3           2              shift3         7


sarcshiftpointuser : 

   id    point_id    shift_id    table_id    user_id    xdate  
    1       2            1          1           62        2014-01-05
    2       2            1          1           0         2014-01-05
    3       2            1          1           71        2014-01-05
    4       2            2          1           0         2014-01-05
    5       2            2          1           0         2014-01-05
    6       2            2          1           52        2014-01-05
    7       2            3          1           52        2014-01-05
    8       2            3          1           62        2014-01-05
    9       2            3          1           71        2014-01-05
    10      2            1          1           71        2014-01-06
    11      2            1          1           52        2014-01-06
    12      2            1          1           0         2014-01-06
    13      2            2          1           62        2014-01-06
    14      2            2          1           0         2014-01-06
    15      2            2          1           52        2014-01-06
    16      2            3          1           62        2014-01-06
    17      2            3          1           52        2014-01-06
    18      2            3          1           71        2014-01-06

如果我通过更改班次应用此查询3次应返回:

          52    62    71       
shift1     1     2     2
shift2     2     1     0
shift3     2     2     2

在sarcshiftpointuser中的shift2中,不显示用户71 所以,当我执行代码时,它将返回到不是三个字段?计数0未返回

          52    62    71
shift2    2      1

更具体: 我需要将此表导出到excel中,所以当0不返回时,它会给我一个错误的顺序和错误的值(逻辑上)

2 个答案:

答案 0 :(得分:0)

您需要使用IFNULL

的嵌套查询

看看这个

http://www.w3schools.com/sql/sql_isnull.asp

类似的东西,

IFNULL(用户,0)

答案 1 :(得分:0)

我认为您指的是交叉表查询。您可以使用PIVOT返回结果集。请参考以下链接。

Sql Server 2008 Cross Tab Query

如果您为sarcuser,sarcshiftpointuser,sarcalllevel& s提供少量样本数据。 sarcshiftpointtable表,然后我们可以给你一个更好的答案。