SELECT count(STATUS) AS STATUS, USER_ID
from Table1
WHERE USER_ID = '65'
group by STATUS, USER_ID
order by STATUS
如果没有找到行,则在sql中返回0
答案 0 :(得分:1)
如果删除group by
,查询将始终返回1行。如果找不到用户,则应返回count(STATUS)
等于0
的一行:
SELECT '65'
, count(STATUS) AS STATUS
FROM Table1
WHERE USER_ID = '65'
或者,当用户不在时,您可以使用union
来显示0
行:
SELECT USER_ID
, count(STATUS) AS STATUS
FROM Table1
WHERE USER_ID = '65'
GROUP BY
USER_ID
UNION ALL
SELECT '65'
, 0
WHERE NOT EXISTS
(
SELECT *
FROM Table1
WHERE USER_ID = '65'
)
编辑(来自戈登):
如果您反对让用户ID出现两次,那么只需执行以下操作:
select u.user_id, count(t1.status)
from (select 65 as user_id) u left join
table1 t1
on t1.user_id = u.user_id
group by u.user_id;
答案 1 :(得分:0)
好的,您的限定符是User_Id必须存在。所以只需检查一下。
if Exists(Select * from Table1 where User_Id=65)
SELECT count(STATUS) AS STATUS, USER_ID from Table1 WHERE USER_ID = '65' group by STATUS, USER_ID order by STATUS
else Select 0 as Status, 65 as User_Id
显然在最终代码中使用变量而不是“65”,我假设您实际上想要搜索多行,例如(其中user_id为(xx,xx,xx,xx),否则其他人已指出,顺序是多余的。
另一种方法是从要测试的用户列表中对表进行交叉应用,这将生成用户列表然后计数(再次假设您要实际返回多行)。
答案 2 :(得分:0)
不是那么优雅,也许......但它有效:
{{1}}
我只删除了您的订单,与计数无关
答案 3 :(得分:0)
这通常使用外部联接:选择用户并外部加入状态数据。
顺便说一句,按状态分组并且不在结果中显示列是没有意义的。如果您的结果中有65-4,65-2,65-8,而不知道哪个计数属于哪个状态,结果会告诉您什么?
select count(*), t1.status, u.user_id
from users u
left join table1 t1 on t1.user_id = u.user_id
where u.user_id = 65
group by t1.status, u.user_id
order by t1.status;
最好还有一个状态表,然后是外连接table1,以便获得所有可能的状态及其出现次数,包括零。 (对于多个用户,您首先要与用户交叉加入状态;对于单个用户,您不会,但将user_id = 65
放在ON
子句中。)< / p>