我正在尝试使用MySQL以订阅者下降的顺序打印前5个公司名称和用户数。我还想把像'N / A',''(空白),'null'这样的虚假公司名称卷起来,并在结果的底部将它们列为未指定。
以下是它的样子:
公司订户
Microsoft 10
谷歌8
Facebook的6
苹果2
未指定的9
你可以看到'未指定'在底部,尽管它有9个人。
通常我使用case语句来汇总这些虚假值,如下所示:
SELECT
CASE
WHEN sc.company_name not in ('null', 'n/a', '')
THEN company_name
ELSE 'Unspecified'
END as company, count(*) as subscribers
from table
group by company
ORDER BY
CASE WHEN company = 'Unspecified' THEN 1 ELSE 0 END, subscribers DESC, company
但是,限制为5条记录时,上述方法不起作用。
我也尝试使用这样的联盟:
select * from
(SELECT
company_name as company, count(*) as subscribers
from table
where company_name not in ('null', 'n/a', '')
group by company
order by subscribers desc, company asc
limit 4) z
union all
select 'Unspecified' as company, count(*) as subscribers
from table
where company_name in ('null', 'n/a', '')
group by company
但是这不起作用,因为未指定的行不一定总是在前5行。
这可以在单个SQL语句中使用吗?我不能使用存储过程或任何花哨的东西,因为这是一个Jasper报告。
答案 0 :(得分:0)
使用您的第一个查询,但不要在Unspecified
中检查ORDER BY
,并将其限制在前5位。然后将其放入子查询中,并重新排序以放置{ {1}}最后。
unspecified