【问题标题】:return the count of row even if null sql server即使为空 sql server,也返回行数
【发布时间】:2014-04-25 15:40:02
【问题描述】:

我尝试执行 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 时,它会给我一个错误的顺序和错误的值(逻辑上)

【问题讨论】:

  • 您的示例数据在列中有用户。您的查询会将用户放在行中。并且,没有移位的输出。您能否编辑您的问题以使示例数据和查询兼容?
  • 也许我错过了,如果您通过更改 shift_id 执行此查询 3 次,则为您提供该表,但我需要它在我搜索 shift_id = 2 (shift2) 它应该返回 5 - 0 但它只是return 5 我也需要它来返回 0
  • Samy,你能否给我们提供 sarcuser、sarcshiftpointuser、sarcalllevel 和 sarcshiftpointtable 表中的样本数据。那么我们就很容易理解真正的问题了。
  • 坦率地说,您的查询还有许多其他问题。要像您建议的那样折叠查询将需要 很多 更多的工作。正如其他人所说,请给我们起始样本数据。

标签: sql sql-server


【解决方案1】:

您将需要使用 IFNULL 使用嵌套查询

看看这个

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

类似的,

IFNULL(user,0)

【讨论】:

  • 虽然IFNULL()(或其标准版本,COALESCE()可以在面对 null 时提供结果,但此处的语句需要进一步修改才能利用这一点.目前,对于要调用的函数,根本没有行。
【解决方案2】:

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

Sql Server 2008 Cross Tab Query.

如果您为 sarcuser 、 sarcshiftpointuser 、 sarcalllevel 和 sarcshiftpointtable 表提供少量样本数据,那么我们可以为您提供更好的答案。

【讨论】:

  • 应避免仅链接的答案 - 至少,您需要提取您认为相关的部分。是的,旋转数据将给出以指定方式格式化的结果;您能否对原始查询进行合理修改?
猜你喜欢
  • 1970-01-01
  • 2015-12-30
  • 2019-04-20
  • 1970-01-01
  • 1970-01-01
  • 2018-11-04
  • 1970-01-01
  • 2018-04-04
  • 1970-01-01
相关资源
最近更新 更多