【发布时间】: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