SQL关于GROUP BY字段为空的处理.

止境 2013-03-19 06:22:06
现在我有多个表关联,其中表中的字段里新增加了一列invoice_no但是,此列为空值,由用户后期修改的,但是在我GROUP BY后全部都分到一个组里了。
我想将内容为空的不分到一个组里,全部都显示出来要怎么做?
但是,如果invoice_no不包含在GROUP BY中,就会报:选择列表中的列 'AMS_EQUIP_BUY.invoice_no' 无效,因为该列没有包含在聚合函数或 GROUP BY 子句中。

求修改方法。

SELECT
eb.invoice_no,
e.equip_name,
e.unit,
isnull(dtl1.type_name, '') + ' ' + isnull(dtl.type_name, '') AS type_name,
eb.funds_source,
eb.buy_date,
eb.price,
SUM (eb.equip_num) AS num,
(eb.price * SUM(eb.equip_num)) AS total_price
FROM
AMS_EQUIP e
LEFT JOIN AMS_EQUIP_BUY eb ON e.buy_id = eb.buy_id
LEFT JOIN ams_type_record_relation r ON e.equip_id = r.record_id
AND r.use_name = 'equipAccount'
LEFT JOIN ams_type_detail dtl ON r.type_id = dtl.type_id
LEFT JOIN ams_type_detail dtl1 ON dtl.parent_id = dtl1.type_id
LEFT JOIN AMS_EQUIP_DEPT ed ON ed.equip_id = e.equip_id
${request.whereCondition}
GROUP BY
eb.invoice_no,
e.equip_name,
e.unit,
eb.funds_source,
eb.buy_date,
eb.price,
dtl1.type_name,
dtl.type_name
...全文
10221 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
-Tracy-McGrady- 2013-03-20
  • 打赏
  • 举报
回复
你这问题貌似不能实现哦
發糞塗牆 2013-03-20
  • 打赏
  • 举报
回复
引用 8 楼 hc1104 的回复:
引用 4 楼 DBA_Huangzj 的回复: 引用 3 楼 hc1104 的回复:引用 2 楼 DBA_Huangzj 的回复:联机丛书:如果组合列包含 Null 值,则所有的 Null 值都将被视为相等,并会置入一个组中。 下面是我自己的话:当你那个列有值之后,自然就不在一组了, 我现在的意图,就是不想让那一列分组,但是聚集索引下,必须得指定invoice_no这一列,这怎么办?这跟……
null对于SQLServer的group by来说就是同一个值,分不开的。
止境 2013-03-20
  • 打赏
  • 举报
回复
引用 4 楼 DBA_Huangzj 的回复:
引用 3 楼 hc1104 的回复:引用 2 楼 DBA_Huangzj 的回复:联机丛书:如果组合列包含 Null 值,则所有的 Null 值都将被视为相等,并会置入一个组中。 下面是我自己的话:当你那个列有值之后,自然就不在一组了, 我现在的意图,就是不想让那一列分组,但是聚集索引下,必须得指定invoice_no这一列,这怎么办?这跟聚集索引什么关系啊?T-……
不需要的,只是想将这列的空值都分开,而不合并.
止境 2013-03-20
  • 打赏
  • 举报
回复
引用 6 楼 HEROWANG 的回复:
换一个思路,你可以增加一个临时列,把null行的分开。
我在网上也看过相关资料也是用这样的方法,具体怎么做呢?
  • 打赏
  • 举报
回复
换一个思路,你可以增加一个临时列,把null行的分开。
sankyqiu 2013-03-20
  • 打赏
  • 举报
回复
如果该列为空值,可否给个默认值再进行分组呢!!!!
Vidor 2013-03-20
  • 打赏
  • 举报
回复
是这个意思吧!?
with tb(a,b) as
(
	select null, 1 union all
	select null, 2 union all
	select    3, 3 union all
	select    3, 4
)
select a, sum(b) from tb group by isnull(a,checksum(newid())), a
/*
a           
----------- -----------
NULL        1
NULL        2
3           7

(3 行受影响)

*/
如果是,想办法把newid转换成invoice_no的数据类型,这里假设int,所以用checksum。
發糞塗牆 2013-03-20
  • 打赏
  • 举报
回复
可以,但是会有一些难度,现在假设一下,一个表有2列,一列就是你那个null的列,一列是A,有数据,那么group by的时候,如果不加入group by a,那么全部分到一组,当你再加一列B的话,问题就来了,除非你这个列B的每一行的值都是唯一的,否则始终会有几行或者很多行,会因为B的值有重复而导致多行NULL值依旧分在同一组
止境 2013-03-20
  • 打赏
  • 举报
回复
引用 9 楼 DBA_Huangzj 的回复:
引用 8 楼 hc1104 的回复:引用 4 楼 DBA_Huangzj 的回复: 引用 3 楼 hc1104 的回复:引用 2 楼 DBA_Huangzj 的回复:联机丛书:如果组合列包含 Null 值,则所有的 Null 值都将被视为相等,并会置入一个组中。 下面是我自己的话:当你那个列有值之后,自然就不在一组了, 我现在的意图,就是不想让那一列分组,但是聚……
有没有像6楼的方式可以换个角度分开的情况呢?
發糞塗牆 2013-03-19
  • 打赏
  • 举报
回复
引用 3 楼 hc1104 的回复:
引用 2 楼 DBA_Huangzj 的回复:联机丛书:如果组合列包含 Null 值,则所有的 Null 值都将被视为相等,并会置入一个组中。 下面是我自己的话:当你那个列有值之后,自然就不在一组了, 我现在的意图,就是不想让那一列分组,但是聚集索引下,必须得指定invoice_no这一列,这怎么办?
这跟聚集索引什么关系啊?T-SQL的执行顺序是先from然后....然后group by,再select的,而你那个是因为groupby没出现那列,所以SELECT也就不行了,,你那列需要进行聚合运算吗?
止境 2013-03-19
  • 打赏
  • 举报
回复
引用 2 楼 DBA_Huangzj 的回复:
联机丛书:如果组合列包含 Null 值,则所有的 Null 值都将被视为相等,并会置入一个组中。 下面是我自己的话:当你那个列有值之后,自然就不在一组了,
我现在的意图,就是不想让那一列分组,但是聚集索引下,必须得指定invoice_no这一列,这怎么办?
發糞塗牆 2013-03-19
  • 打赏
  • 举报
回复
联机丛书:如果组合列包含 Null 值,则所有的 Null 值都将被视为相等,并会置入一个组中。 下面是我自己的话:当你那个列有值之后,自然就不在一组了,
shoppo0505 2013-03-19
  • 打赏
  • 举报
回复
如果数据都不对,那么做数据库开发有什么意义? 所以,先要保证数据的正确性。 此问题无解。

22,206

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧