想查询20行数据实际少于20行就补空值或者0凑足20行

yjjone 2016-07-14 11:36:02
select mishu from t_table
----------------------------------------------------------
mishu
1 5
2 5.6
3 35
4 1.5

实际查询结果

-----------------------------------------------------------
mishu
1 5
2 5.6
3 35
4 1.5
5 0
6 0
.
.
.

19 0
20 0

想要达到的查询结果







...全文
262 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
道素 2016-07-15
  • 打赏
  • 举报
回复
这也是一种供参考的方法


DECLARE @x XML= CONVERT(XML,REPLICATE('<n>0</n>',20))

;with t(id, mishu ) as
(
select 1, 5 union all
select 2, 5.6 union all
select 3, 35 union all
select 4, 1.5
)
select isnull(b.id,c.id) AS id,isnull(b.mishu,0) AS mishu from (SELECT ROW_NUMBER()OVER(ORDER BY GETDATE()) AS rn, f.value('.','int') id FROM @x.nodes('n') a(f))c
LEFT JOIN (SELECT ROW_NUMBER()OVER(ORDER BY id) AS rn,t.* FROM t) b ON c.rn=b.rn

id mishu 1 5.0 2 5.6 3 35.0 4 1.5 0 0.0 0 0.0 0 0.0 0 0.0 0 0.0 0 0.0 0 0.0 0 0.0 0 0.0 0 0.0 0 0.0 0 0.0 0 0.0 0 0.0 0 0.0 0 0.0
中国风 2016-07-15
  • 打赏
  • 举报
回复
引用 18 楼 yjjone 的回复:
这个不是看的很懂,还是用前面的那种吧- -
哥的方法很明显更高效率
yjjone 2016-07-15
  • 打赏
  • 举报
回复
select mishu=isnull(b.mishu,0) from (select number from master.dbo.spt_values where type='P' and number between 1 and 20) a left join (select mishu,rn=row_number() over(order by Id) from T_FinishJincang where RunNO='160710001') b on a.number=b.rn order by a.number 最终选用了这种方式,得到的数组,然后把数组中的值赋值给水晶报表做参数 谢谢大家 如果这个有bug请联系我啊
yjjone 2016-07-15
  • 打赏
  • 举报
回复
引用 14 楼 roy_88 的回复:
[quote=引用 11 楼 yjjone 的回复:] 我忘记说明,这个查询条数是不固定的, 但是要求返回值是20行
这样红色限制记录数,这样写法应该比较有效率,你可以测测,把sys.columns可以用CTE替换在内存里处理更快 Select TOP 20 [mishu] from @T UNION ALL SELECT TOP (20-(SELECT CASE WHEN COUNT(*)>=20 THEN 20 ELSE COUNT(*) END FROM @T))0 FROM sys.columns [/quote] 这个不是看的很懂,还是用前面的那种吧- -
bld213 2016-07-15
  • 打赏
  • 举报
回复
t_table 设置一个主键id select a.number ,case when b.mishu is null then 0 else b.mishu end mishu from (select number from master.dbo.spt_values where type='P' and number between 1 and 20) a left join t_test b on a.number=b.id order by a.number 执行结果 1 223.0 2 4.0 3 3.0 4 34.0 5 44.0 6 0.0 7 0.0 8 0.0 9 0.0 10 0.0 11 0.0 12 0.0 13 0.0 14 0.0 15 0.0 16 0.0 17 0.0 18 0.0 19 0.0 20 0.0
yjjone 2016-07-14
  • 打赏
  • 举报
回复
引用 4 楼 xiaoxiangqing 的回复:
楼上的就可以,预先生成20笔数据,然后用left关联
我发现每次查询对应的数据会变
yjjone 2016-07-14
  • 打赏
  • 举报
回复
引用 3 楼 ap0405140 的回复:

select mishu=isnull(b.mishu,0)
 from (select number
           from master.dbo.spt_values
           where type='P' and number between 1 and 20) a
 left join (select  mishu,rn=row_number() over(order by getdate()) from t_table) b on a.number=b.rn
这个效果达到了,,,但是我试了下发现 顺序会错乱
xiaoxiangqing 2016-07-14
  • 打赏
  • 举报
回复
楼上的就可以,预先生成20笔数据,然后用left关联
唐诗三百首 2016-07-14
  • 打赏
  • 举报
回复

select mishu=isnull(b.mishu,0)
 from (select number
           from master.dbo.spt_values
           where type='P' and number between 1 and 20) a
 left join (select  mishu,rn=row_number() over(order by getdate()) from t_table) b on a.number=b.rn
zbdzjx 2016-07-14
  • 打赏
  • 举报
回复
with t_table(id, mishu ) as
(
select 1, 5 union all
select 2, 5.6 union all
select 3, 35 union all
select 4, 1.5
)
select a.number, ISNULL(b.mishu, 0) from 
(select number+1 number from master..spt_values where type='P' and number<20) a 
left join t_table b on a.number=b.id
mingqing6364 2016-07-14
  • 打赏
  • 举报
回复

SELECT
	*
INTO
	#T_table
FROM
	(
		SELECT 1 AS ID,'5' AS mishu UNION ALL
		SELECT 2 AS ID,'5.6' AS mishu UNION ALL
		SELECT 3 AS ID,'35' AS mishu UNION ALL
		SELECT 4 AS ID,'1.5' AS mishu
	) AS A

CREATE TABLE #T (ID INT)
DECLARE @i INT = 1
WHILE @i <= 20
BEGIN
INSERT INTO #T VALUES (@i)
SET @i = @i + 1
END

SELECT #T.ID,#T_table.mishu,ISNULL(#T_table.mishu, '0') FROM #T LEFT JOIN #T_table ON #T.ID = #T_table.ID


DROP TABLE #T
tcmakebest 2016-07-14
  • 打赏
  • 举报
回复
这无中生有的把戏可不是SQL的专长, 何不取出来之后用编程语言实现呢
中国风 2016-07-14
  • 打赏
  • 举报
回复
引用 11 楼 yjjone 的回复:
我忘记说明,这个查询条数是不固定的, 但是要求返回值是20行
这样红色限制记录数,这样写法应该比较有效率,你可以测测,把sys.columns可以用CTE替换在内存里处理更快 Select TOP 20 [mishu] from @T UNION ALL SELECT TOP (20-(SELECT CASE WHEN COUNT(*)>=20 THEN 20 ELSE COUNT(*) END FROM @T))0 FROM sys.columns
Northony 2016-07-14
  • 打赏
  • 举报
回复
引用 11 楼 yjjone 的回复:
[quote=引用 9 楼 roy_88 的回复:]
use Tempdb
go
--> --> 
 
declare @T table([mishu] FLOAT)
Insert @T
select 5 union all
select 5.6 union all
select 35 union all
select 1.5
 
Select [mishu] from @T
UNION ALL
SELECT TOP (20-(SELECT COUNT(*) FROM @T))0 FROM sys.columns
/*
mishu
5
5.6
35
1.5
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
*/
谢谢版主 我忘记说明,这个查询条数是不固定的, 但是要求返回值是20行[/quote] 输出列是固定的就可以吧,把这个表变量的结果变成你要输出的结果集就可以了。
yjjone 2016-07-14
  • 打赏
  • 举报
回复
引用 10 楼 ap0405140 的回复:

select mishu=isnull(b.mishu,0)
 from (select number
           from master.dbo.spt_values
           where type='P' and number between 1 and 20) a
 left join (select  mishu,rn=row_number() over(order by Id) from T_FinishJincang where RunNO='160710001') b on a.number=b.rn
 order by a.number
谢谢,原来是还少个排序
yjjone 2016-07-14
  • 打赏
  • 举报
回复
引用 9 楼 roy_88 的回复:
use Tempdb
go
--> --> 
 
declare @T table([mishu] FLOAT)
Insert @T
select 5 union all
select 5.6 union all
select 35 union all
select 1.5
 
Select [mishu] from @T
UNION ALL
SELECT TOP (20-(SELECT COUNT(*) FROM @T))0 FROM sys.columns
/*
mishu
5
5.6
35
1.5
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
*/
谢谢版主 我忘记说明,这个查询条数是不固定的, 但是要求返回值是20行
唐诗三百首 2016-07-14
  • 打赏
  • 举报
回复

select mishu=isnull(b.mishu,0)
 from (select number
           from master.dbo.spt_values
           where type='P' and number between 1 and 20) a
 left join (select  mishu,rn=row_number() over(order by Id) from T_FinishJincang where RunNO='160710001') b on a.number=b.rn
 order by a.number
中国风 2016-07-14
  • 打赏
  • 举报
回复
use Tempdb
go
--> --> 
 
declare @T table([mishu] FLOAT)
Insert @T
select 5 union all
select 5.6 union all
select 35 union all
select 1.5
 
Select [mishu] from @T
UNION ALL
SELECT TOP (20-(SELECT COUNT(*) FROM @T))0 FROM sys.columns
/*
mishu
5
5.6
35
1.5
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
*/
yjjone 2016-07-14
  • 打赏
  • 举报
回复
引用 7 楼 ap0405140 的回复:
[quote=引用 5 楼 yjjone 的回复:] 这个效果达到了,,,但是我试了下发现 顺序会错乱
请具体说明" 顺序错乱"的现象,并提供实际执行的SQL语句.[/quote]
select mishu=isnull(b.mishu,0)
 from (select number
           from master.dbo.spt_values
           where type='P' and number between 1 and 20) a
 left join (select  mishu,rn=row_number() over(order by Id) from T_FinishJincang where RunNO='160710001') b on a.number=b.rn
mishu 0.8 1.7 0 0 0 0 0.8 0.8 0 0 0 0 3.4 3.4 3.4 0 0 0 0 0 多次按执行案件,数字位置不一样 --------------------------------------------------------
唐诗三百首 2016-07-14
  • 打赏
  • 举报
回复
引用 5 楼 yjjone 的回复:
这个效果达到了,,,但是我试了下发现 顺序会错乱
请具体说明" 顺序错乱"的现象,并提供实际执行的SQL语句.

34,575

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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