我尝试执行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不返回时,它会给我一个错误的顺序和错误的值(逻辑上)
答案 0 :(得分:0)
答案 1 :(得分:0)
我认为您指的是交叉表查询。您可以使用PIVOT返回结果集。请参考以下链接。
Sql Server 2008 Cross Tab Query
如果您为sarcuser,sarcshiftpointuser,sarcalllevel& s提供少量样本数据。 sarcshiftpointtable表,然后我们可以给你一个更好的答案。