2 sd2208464 sd2208464 于 2016.01.31 21:16 提问

sql server查询结果连续的问题。

有两个字段value和type,type是int类型。固定1,2,3,4,5。查询数据时按type分组。
具体语句为:
select avg(value) from [table] group by type

得到的结果是
value type
2 1
2 2
4 3

期望的结果是
value type
2 1
2 2
4 3
0 4
0 5

也就是没有的用0来填充。

6个回答

caozhy
caozhy   Ds   Rxr 2016.01.31 21:48
已采纳
 再定义一个表,叫t1,两个字段:value type,数据
0 1
0 2
...
0 5

查询
(select avg(value) as value from [table] group by type) union (select * from t1 where t1.type not in (select type from [table]))
sd2208464
sd2208464   2016.01.31 22:06

恩。是个办法。但是需要建表。而且维护不易。从论坛看到这么个方法。

 select a.number,ISNULL(b.value,0) from 
(select number from master..spt_values
where type='p' and number between 1 and 5) a

left join 

(SELECT  AVG(value) AS value, type
FROM         [table]

GROUP BY type ) b
on a.number = b.type
JX_yang_zhi
JX_yang_zhi 回复caozhy: s s ss
2 年多之前 回复
JX_yang_zhi
JX_yang_zhi 回复caozhy: s s ss
2 年多之前 回复
caozhy
caozhy 嗯,外连接也是一个办法。
2 年多之前 回复
caozhy
caozhy   Ds   Rxr 2016.01.31 21:20

value可以是null的?不然不可能没有4 5啊,贴出你原始数据看看

sd2208464
sd2208464   2016.01.31 21:24

value是可以不添的。也就是说。用户选择了type是1 2 3 的项。没选择4和5的项。那么数据库里就不存在type是4和5的数据了。

enpterexpress
enpterexpress   Rxr 2016.01.31 22:50
sd2208464
sd2208464 这个跟分类汇总还有点区别!!
2 年多之前 回复
java_0_day
java_0_day   2016.02.01 01:42

你把所有的value值都+1 这样就没有0了,最少就是1,查询出来把结果-1不就完了,简单明了

sd2208464
sd2208464 主要是type不一定肯定有1.2.3.4.5。有可能只有123或者45.
2 年多之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐
sql server 得到连续日期查询
转载:http://blog.csdn.net/xys_777/article/details/5681208 --〉生成连续日期的方法 IF OBJECT_ID('tempdb..#t') IS NOT NULL  DROP TABLE #t GO create table #t(id int identity,Dt varchar(10)) go declare  @start
在论坛中出现的比较难的sql问题:7(子查询 判断某个字段的值是否连续)
最近,在论坛中,遇到了不少比较难的sql问题,虽然自己都能解决,但发现过几天后,就记不起来了,也忘记解决的方法了。 所以,觉得有必要记录下来,这样以后再次碰到这类问题,也能从中获取解答的思路。 1、数据查询,行转列的问题。 http://bbs.csdn.net/topics/390621630?page=1#post-395855019 根
SQL Server 查询连续月份的方法
       最近一个朋友那有这么一个需求:需要查询出连续6个月有登陆的用户,并且查询的时间段可能会有跨年的情况。今天就分享一下我帮朋友解决的查询连续月份的方法。首先模拟一个用户登陆表CREATE TABLE UserLogin ( UserName VARCHAR(10), --用户名 LoginTime DATETIME --登陆日期 )插入一些模拟数据,简单模拟一下用户的登陆信息,...
巧用SQL的with语法生成临时结果集,进行查询与更新同步操作,解决高并发下对数据的重复访问
目前,我们通过Java去读取数据,并更新数据时,首先会在Java代码中读取数据,再设定某些值,再去更新数据。那么有可能会有多个线程读到相同的内容, 就算在读时用for update,但在返回结果到Java时,在做更新数据之前,总会有那么一点空隙,可能会导致高并下操作数据库时访问到相同的数据。 而通过SQL中的with语法,首先更新数据,再将更新后受影响数据行放到临时表中,就可避
[sql server] 得到连续日期查询
得到连续日期需要借助一个有连续序号的表,参考如何得到连续序号根据开始时间,结束时间 生成连续的时间然后在用这个连续的时间去比较表里的数据例子:ifobject_id('TZ_Money')isnotnulldroptable TZ_Money gocreatetable TZ_Money(    Id intidentity(1,1) primarykey,       Uid varchar(8) notnull,            --用户ID    Income numeric(10,2) no
SQL连续天数问题
IF OBJECT_ID('tempdb..#Test_Gap') IS NOT NULL DROP TABLE #Test_Gap go CREATE TABLE #Test_Gap ( id INT IDENTITY, CreateDate DATETIME ) go INSERT INTO #Test_Gap VALUES (GETDATE()-20) INSERT INTO #Test
【原创】SqlServer、利用递归查询、将日期范围转换为日期表
在做项目任务时,需要将一个日期范围转换为日期表。 例如:日期范围(2017年01月21日~2017年02月20日)、转换成一日为单位的日期表,如下。 2017-01-21 2017-01-22 2017-01-23 …… 2017-02-19 2017-02-20直接上SQL,查询结果如上:SET LANGUAGE N'Simplified Chinese' DECLARE @Star
查找SQL Server自增ID不连续记录
<br />解决办法的核心思想:获取到当前记录的下一条记录的ID值,再判断这两个ID值是否差值为1,如果不为1那就表示数据不连续了。<br /> <br />-------------------------生成测试数据--------------------------<br />if exists (select * from sysobjects where id = OBJECT_ID('[hr_z_zfuser]') and OBJECTPROPERTY(id, 'IsUserTable') =
sql经典问题-查询连续的时间
今天遇到一个问题,需要查询用户连续下单的月份 这个跟查询用户连续登陆的天数一样 都是查询连续的时间或者数字 这样的查询在oracle中需要用到ROW_NUMBER() OVER(partition by 分组的列 order by 排序的列)函数 举例如下: 今天是5号 表A 用户 登陆的日期   用户在表中用userid字段表示 日期date a            5
sql找出连续日期和连续数字
tips: 1 代码在sqlserver2005实现,其他数据需要经过修改 2 计算连续时间和连续数字是同一类问题,所以合起来一起说,计算连续时间的时候只不过将时间转换成数字而已 3 此方法相对高效 第一步 构造数据 create table #tmptable(id int identity(1,1),rq smalldatetime) insert #tmptable v