在论坛中出现的比较难的sql问题:26(动态行专列+合并字符串、补足行数)
原文:在论坛中出现的比较难的sql问题:26(动态行专列+合并字符串、补足行数)
最近,在论坛中,遇到了不少比较难的sql问题,虽然自己都能解决,但发现过几天后,就记不起来了,也忘记解决的方法了。
所以,觉得有必要记录下来,这样以后再次碰到这类问题,也能从中获取解答的思路。
1、请教一个存储过程,同批不足指定行数的插行
http://bbs.csdn.net/topics/390738052
一、表结构如下:
CREATE TABLE [dbo].[Table_test](
[bh] [varchar](20) NULL,
[name] [varchar](50) NULL,
[ye] [decimal](18, 2) NULL
) ON [PRIMARY]
二、测试数据如下:
insert into table_test(bh,name,ye) values('t001','李明',1000)
insert into table_test(bh,name,ye) values('t001','李张',1000)
insert into table_test(bh,name,ye) values('t001','李三',1000)
insert into table_test(bh,name,ye) values('t001','李四',1000)
insert into table_test(bh,name,ye) values('t002','孙明',1100)
insert into table_test(bh,name,ye) values('t002','李达',1100)
insert into table_test(bh,name,ye) values('t003','陈明',1200)
insert into table_test(bh,name,ye) values('t003','刘志',1200)
insert into table_test(bh,name,ye) values('t003','孙华',1200)
三、达到目标:现在是4行为一个批次编号(注4行或5行都可以),同一批次
不足4行的,要插入同批次编号的行。 效果如下:
bh name ye
------------------------------
t001 李明 1000.00
t001 李张 1000.00
t001 李三 1000.00
t001 李四 1000.00
t002 孙明 1100.00
t002 李达 1100.00
t002 NULL NULL
t002 NULL NULL
t003 陈明 1200.00
t003 刘志 1200.00
t003 孙华 1200.00
t003 NULL NULL
(注: 7.8.12行是要插入的行次。)
我的方法:
-
--补足4条记录
-
insert into [Table_test]
-
select bh,null,null
-
from
-
(
-
select bh,COUNT(*) c
-
from [Table_test]
-
group by bh
-
)t,master..spt_values s
-
where s.type = 'P' and s.number >=1 and s.number <= 4-c
-
-
-
--再次查询
-
select *
-
from [Table_test]
-
order by bh,name desc
-
/*
-
bh name ye
-
t001 李张 1000.00
-
t001 李四 1000.00
-
t001 李三 1000.00
-
t001 李明 1000.00
-
t002 孙明 1100.00
-
t002 李达 1100.00
-
t002 NULL NULL
-
t002 NULL NULL
-
t003 孙华 1200.00
-
t003 刘志 1200.00
-
t003 陈明 1200.00
-
t003 NULL NULL
-
*/
2、sql 合并id相同的数据
http://bbs.csdn.net/topics/390726775
表A:
id 车号
1 辽A1111
2 辽B2222
表B:
id 表A_id 车号 箱号 封号 客户
1 1 辽A1111 001 001 张三
2 1 辽A1111 002 002 李四
3 2 辽B2222 003 003 王五
通过表A的id和表B的 表A_id实现关联,一条表A的数据可以有一个或者两个箱号,一个箱号可能有多个客户,
实现综合查询 组合成一个新表(不使用函数)。
车号 箱号 封号 箱号 封号 客户
辽A1111 001 001 002 002 张三/李四
辽B2222 003 003 王五
sql server 2000的系统。
这个问题,由于不能用函数,这里我通过分组求max,然后再相加的方法来处理字符串的累加问题。
我的方法:
-
create table A(id int, 车号 varchar(20))
-
-
insert into a
-
select 1 ,'辽A1111' union all
-
select 2 ,'辽B2222'
-
-
-
create table B(
-
id int,A_id int,
-
车号 varchar(10),
-
箱号 varchar(10),
-
封号 varchar(10),
-
客户 varchar(10))
-
-
insert into B
-
SELECT 1,1,'辽A1111','001','001','张三' UNION ALL
-
SELECT 2,1,'辽A1111','002','002','李四' UNION ALL
-
SELECT 3,2,'辽B2222','003','003','王五'
-
go
-
-
-
if OBJECT_ID('tempdb..#temp') is not null
-
drop table #temp
-
-
select *,
-
(select count(*) from B where t.A_id = b.A_id and t.id>=b.id) rn
-
into #temp
-
from B t
-
-
-
declare @sql varchar(4000)
-
declare @sql_t varchar(4000)
-
-
set @sql = ''
-
set @sql_t = ''
-
-
select @sql = @sql + ',max(case when rn ='+CAST(rn as varchar)+' then 箱号 else '''' end) 箱号'
-
+ ',max(case when rn ='+CAST(rn as varchar)+' then 封号 else '''' end) 封号'
-
from #temp
-
group by rn
-
-
-
select @sql_t = @sql_t + '+max(case when rn ='+CAST(rn as varchar)+' then ''/''+客户 else '''' end)'
-
from #temp
-
group by rn
-
-
-
-
set @sql = 'select a_id as id,车号'+@sql + ',stuff('+stuff(@sql_t,1,1,'')+',1,1,'''') as 客户'+
-
' from #temp
-
group by a_id,车号'
-
-
exec(@sql)
-
/*
-
id 车号 箱号 封号 箱号 封号 客户
-
1 辽A1111 001 001 002 002 张三/李四
-
2 辽B2222 003 003 王五
-
*/
生成的动态语句:
-
select a_id as id,
-
车号,
-
-
max(case when rn =1 then 箱号 else '' end) 箱号,
-
max(case when rn =1 then 封号 else '' end) 封号,
-
-
max(case when rn =2 then 箱号 else '' end) 箱号,
-
max(case when rn =2 then 封号 else '' end) 封号,
-
-
stuff(max(case when rn =1 then '/'+客户 else '' end)+
-
max(case when rn =2 then '/'+客户 else '' end)
-
,1,1,'') as 客户
-
from #temp
-
group by a_id,
-
车号
在论坛中出现的比较难的sql问题:26(动态行专列+合并字符串、补足行数)的更多相关文章
- 在论坛中出现的比较难的sql问题:46(日期条件出现的奇怪问题)
原文:在论坛中出现的比较难的sql问题:46(日期条件出现的奇怪问题) 最近,在论坛中,遇到了不少比较难的sql问题,虽然自己都能解决,但发现过几天后,就记不起来了,也忘记解决的方法了. 所以,觉得有 ...
- 在论坛中出现的比较难的sql问题:45(用户在线登陆时间的小时、分钟计算问题)
原文:在论坛中出现的比较难的sql问题:45(用户在线登陆时间的小时.分钟计算问题) 最近,在论坛中,遇到了不少比较难的sql问题,虽然自己都能解决,但发现过几天后,就记不起来了,也忘记解决的方法了. ...
- 在论坛中出现的比较难的sql问题:44(触发器专题 明细表插入数据时调用主表对应的数据)
原文:在论坛中出现的比较难的sql问题:44(触发器专题 明细表插入数据时调用主表对应的数据) 最近,在论坛中,遇到了不少比较难的sql问题,虽然自己都能解决,但发现过几天后,就记不起来了,也忘记解决 ...
- 在论坛中出现的比较难的sql问题:42(动态行转列 考勤时间动态列)
原文:在论坛中出现的比较难的sql问题:42(动态行转列 考勤时间动态列) 所以,觉得有必要记录下来,这样以后再次碰到这类问题,也能从中获取解答的思路.
- 在论坛中出现的比较难的sql问题:41(循环替换 循环替换关键字)
原文:在论坛中出现的比较难的sql问题:41(循环替换 循环替换关键字) 所以,觉得有必要记录下来,这样以后再次碰到这类问题,也能从中获取解答的思路.
- 在论坛中出现的比较难的sql问题:40(子查询 销售和历史库存)
原文:在论坛中出现的比较难的sql问题:40(子查询 销售和历史库存) 最近,在论坛中,遇到了不少比较难的sql问题,虽然自己都能解决,但发现过几天后,就记不起来了,也忘记解决的方法了. 所以,觉得有 ...
- 在论坛中出现的比较难的sql问题:39(动态行转列 动态日期列问题)
原文:在论坛中出现的比较难的sql问题:39(动态行转列 动态日期列问题) 最近,在论坛中,遇到了不少比较难的sql问题,虽然自己都能解决,但发现过几天后,就记不起来了,也忘记解决的方法了. 所以,觉 ...
- 在论坛中出现的比较难的sql问题:38(字符拆分 字符串检索问题)
原文:在论坛中出现的比较难的sql问题:38(字符拆分 字符串检索问题) 最近,在论坛中,遇到了不少比较难的sql问题,虽然自己都能解决,但发现过几天后,就记不起来了,也忘记解决的方法了. 所以,觉得 ...
- 在论坛中出现的比较难的sql问题:37(动态行转列 某一行数据转为列名)
原文:在论坛中出现的比较难的sql问题:37(动态行转列 某一行数据转为列名) 所以,觉得有必要记录下来,这样以后再次碰到这类问题,也能从中获取解答的思路.
- 在论坛中出现的比较难的sql问题:36(动态行转列 解析json格式字符串)
原文:在论坛中出现的比较难的sql问题:36(动态行转列 解析json格式字符串) 所以,觉得有必要记录下来,这样以后再次碰到这类问题,也能从中获取解答的思路.
随机推荐
- 图片旋转 1. cv2.getRotationMatrix2D(获得仿射变化矩阵) 2. cv2.warpAffine(进行仿射变化)
原文:https://www.cnblogs.com/my-love-is-python/p/10959612.html 1.rot_mat = cv2.getRotationMatrix2D(ce ...
- ubuntu下如何开机自动执行自定义脚本?
答: 将自定义脚本(假设自定义的脚本绝对路径为~/start_test.sh)添加到/etc/init.d/目录下,并更新系统启动项,命令如下: sudo cp ~/start_test.sh /et ...
- autoComplete TextView
这个比较简单,只是将AutoCompleteTextView绑定一个ArrayAdapter就可以了. 界面布局: <?xml version="1.0" encoding= ...
- 基本使用——OkHttp3详细使用教程
基本使用——OkHttp3详细使用教程 转 https://blog.csdn.net/xx326664162/article/details/77714126 概述 OkHttp现在应该算是最火的H ...
- idea-debug启动会卡住不动,BeanPostProcessors (for example: not eligible for auto-proxying),报错解决
debug启动会卡住不动,run模式启动正常 debug启动输出到下面这行之后,就不会继续输出了 爆出各种 [INFO]- Bean 'dataSource' of type [class Druid ...
- 003-结构型-07-享元模式(Flyweight)
一.概述 提供了减少对象数且从而改善应用所需的对象结构的方式.运用共享技术有效地支持大是细粒度的对象. 它通过与其他类似对象共享数据来减小内存占用.它使用共享物件,用来尽可能减少内存使用量以及分享资讯 ...
- Navigator的使用:
1.路由直接跳转到下一个页面: Navigator.pushNamed(context,"/login"); 2.跳转的下一个页面,替换当前的页面: Navigator.of(co ...
- 泡泡一分钟:Fast and Robust Initialization for Visual-Inertial SLAM
张宁 Fast and Robust Initialization for Visual-Inertial SLAM链接:https://pan.baidu.com/s/1cdkuHdkSi9x7l ...
- Hadoop记录-部署hadoop环境shell实现
#!/bin/bash menu() { echo "---欢迎使用hadoop部署管理程序---" echo "# 1.初始化Linux环境" echo &q ...
- jqweui Popup 使用说明
使用步骤说明: 今天遇到一个问题,无论怎么点击一个图标都不会弹出对应的遮罩层,但是把示列代码拷贝过来又可以正常显示:结果是由于在复制的时候把 # 号弄掉了 错误操作展示: <a href=&qu ...
