1

我有一个简单的查询

select distinct m.STATE_CD, m.sex,SUM(c.cost) as TotalCost
    from members as m
    inner join claims as c on c.patid=m.PATID
    group by cube(m.STATE_CD,m.sex)
    order by m.STATE_CD

它返回一个结果集,如

在此处输入图像描述

我想以STATE_CD现在的方式排序,但是有没有办法让 NULLS 位于结果集的底部,并且STATE_CD列仍然按字母顺序排列,而不添加 CASE 语句来将 NULL 更改为某些东西按字母顺序排在最后?

4

3 回答 3

4

按顺序使用 ISNULL:

DECLARE @test TABLE (STATE CHAR(2));

INSERT @test (STATE)
SELECT NULL
UNION ALL
SELECT 'AK'
UNION ALL
SELECT 'AL'
UNION ALL 
SELECT 'AR';

/*Returns null first*/
SELECT * FROM @test ORDER BY STATE

/*Returns null last*/
SELECT * FROM @test ORDER BY ISNULL(STATE,'ZZ');
于 2012-12-19T18:59:36.110 回答
3

这应该这样做:

ORDER BY CASE WHEN m.STATE_CD IS NULL THEN 2 ELSE 1 END, m.STATE_CD

于 2012-12-19T18:59:04.367 回答
1

您是否必须使用多维数据集分组来进行分层突破?一般来说,我相信它列出了成为空值的分组。你能不能只列出'group by with m.State, m.sex',然后列出一个谓词'where m.state is not null'。可能的修复。

除此之外,您将不得不做一些事情来将空值定义为我猜的分组。类似于 isnull(m.State_CD, 'Totals') 如果您确定所有空值都代表集合的总数。如果您想将它们放在底部但想稍后重命名它们,您始终可以在 cte、临时表、嵌套选择等的集合中重命名它们。然后稍后重新标记它们。

于 2012-12-19T18:59:53.603 回答