原文:在论坛中出现的比较难的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行是要插入的行次。)

我的方法:


  1. --补足4条记录
  2. insert into [Table_test]
  3. select bh,null,null
  4. from
  5. (
  6. select bh,COUNT(*) c
  7. from [Table_test]
  8. group by bh
  9. )t,master..spt_values s
  10. where s.type = 'P' and s.number >=1 and s.number <= 4-c
  11. --再次查询
  12. select *
  13. from [Table_test]
  14. order by bh,name desc
  15. /*
  16. bh name ye
  17. t001 李张 1000.00
  18. t001 李四 1000.00
  19. t001 李三 1000.00
  20. t001 李明 1000.00
  21. t002 孙明 1100.00
  22. t002 李达 1100.00
  23. t002 NULL NULL
  24. t002 NULL NULL
  25. t003 孙华 1200.00
  26. t003 刘志 1200.00
  27. t003 陈明 1200.00
  28. t003 NULL NULL
  29. */

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,然后再相加的方法来处理字符串的累加问题。

我的方法:


  1. create table A(id int, 车号 varchar(20))
  2. insert into a
  3. select 1 ,'辽A1111' union all
  4. select 2 ,'辽B2222'
  5. create table B(
  6. id int,A_id int,
  7. 车号 varchar(10),
  8. 箱号 varchar(10),
  9. 封号 varchar(10),
  10. 客户 varchar(10))
  11. insert into B
  12. SELECT 1,1,'辽A1111','001','001','张三' UNION ALL
  13. SELECT 2,1,'辽A1111','002','002','李四' UNION ALL
  14. SELECT 3,2,'辽B2222','003','003','王五'
  15. go
  16. if OBJECT_ID('tempdb..#temp') is not null
  17. drop table #temp
  18. select *,
  19. (select count(*) from B where t.A_id = b.A_id and t.id>=b.id) rn
  20. into #temp
  21. from B t
  22. declare @sql varchar(4000)
  23. declare @sql_t varchar(4000)
  24. set @sql = ''
  25. set @sql_t = ''
  26. select @sql = @sql + ',max(case when rn ='+CAST(rn as varchar)+' then 箱号 else '''' end) 箱号'
  27. + ',max(case when rn ='+CAST(rn as varchar)+' then 封号 else '''' end) 封号'
  28. from #temp
  29. group by rn
  30. select @sql_t = @sql_t + '+max(case when rn ='+CAST(rn as varchar)+' then ''/''+客户 else '''' end)'
  31. from #temp
  32. group by rn
  33. set @sql = 'select a_id as id,车号'+@sql + ',stuff('+stuff(@sql_t,1,1,'')+',1,1,'''') as 客户'+
  34. ' from #temp
  35. group by a_id,车号'
  36. exec(@sql)
  37. /*
  38. id 车号 箱号 封号 箱号 封号 客户
  39. 1 辽A1111 001 001 002 002 张三/李四
  40. 2 辽B2222 003 003 王五
  41. */

生成的动态语句:


  1. select a_id as id,
  2. 车号,
  3. max(case when rn =1 then 箱号 else '' end) 箱号,
  4. max(case when rn =1 then 封号 else '' end) 封号,
  5. max(case when rn =2 then 箱号 else '' end) 箱号,
  6. max(case when rn =2 then 封号 else '' end) 封号,
  7. stuff(max(case when rn =1 then '/'+客户 else '' end)+
  8. max(case when rn =2 then '/'+客户 else '' end)
  9. ,1,1,'') as 客户
  10. from #temp
  11. group by a_id,
  12. 车号
发布了416 篇原创文章 · 获赞 135 · 访问量 94万+

在论坛中出现的比较难的sql问题:26(动态行专列+合并字符串、补足行数)的更多相关文章

  1. 在论坛中出现的比较难的sql问题:46(日期条件出现的奇怪问题)

    原文:在论坛中出现的比较难的sql问题:46(日期条件出现的奇怪问题) 最近,在论坛中,遇到了不少比较难的sql问题,虽然自己都能解决,但发现过几天后,就记不起来了,也忘记解决的方法了. 所以,觉得有 ...

  2. 在论坛中出现的比较难的sql问题:45(用户在线登陆时间的小时、分钟计算问题)

    原文:在论坛中出现的比较难的sql问题:45(用户在线登陆时间的小时.分钟计算问题) 最近,在论坛中,遇到了不少比较难的sql问题,虽然自己都能解决,但发现过几天后,就记不起来了,也忘记解决的方法了. ...

  3. 在论坛中出现的比较难的sql问题:44(触发器专题 明细表插入数据时调用主表对应的数据)

    原文:在论坛中出现的比较难的sql问题:44(触发器专题 明细表插入数据时调用主表对应的数据) 最近,在论坛中,遇到了不少比较难的sql问题,虽然自己都能解决,但发现过几天后,就记不起来了,也忘记解决 ...

  4. 在论坛中出现的比较难的sql问题:42(动态行转列 考勤时间动态列)

    原文:在论坛中出现的比较难的sql问题:42(动态行转列 考勤时间动态列) 所以,觉得有必要记录下来,这样以后再次碰到这类问题,也能从中获取解答的思路.

  5. 在论坛中出现的比较难的sql问题:41(循环替换 循环替换关键字)

    原文:在论坛中出现的比较难的sql问题:41(循环替换 循环替换关键字) 所以,觉得有必要记录下来,这样以后再次碰到这类问题,也能从中获取解答的思路.

  6. 在论坛中出现的比较难的sql问题:40(子查询 销售和历史库存)

    原文:在论坛中出现的比较难的sql问题:40(子查询 销售和历史库存) 最近,在论坛中,遇到了不少比较难的sql问题,虽然自己都能解决,但发现过几天后,就记不起来了,也忘记解决的方法了. 所以,觉得有 ...

  7. 在论坛中出现的比较难的sql问题:39(动态行转列 动态日期列问题)

    原文:在论坛中出现的比较难的sql问题:39(动态行转列 动态日期列问题) 最近,在论坛中,遇到了不少比较难的sql问题,虽然自己都能解决,但发现过几天后,就记不起来了,也忘记解决的方法了. 所以,觉 ...

  8. 在论坛中出现的比较难的sql问题:38(字符拆分 字符串检索问题)

    原文:在论坛中出现的比较难的sql问题:38(字符拆分 字符串检索问题) 最近,在论坛中,遇到了不少比较难的sql问题,虽然自己都能解决,但发现过几天后,就记不起来了,也忘记解决的方法了. 所以,觉得 ...

  9. 在论坛中出现的比较难的sql问题:37(动态行转列 某一行数据转为列名)

    原文:在论坛中出现的比较难的sql问题:37(动态行转列 某一行数据转为列名) 所以,觉得有必要记录下来,这样以后再次碰到这类问题,也能从中获取解答的思路.

  10. 在论坛中出现的比较难的sql问题:36(动态行转列 解析json格式字符串)

    原文:在论坛中出现的比较难的sql问题:36(动态行转列 解析json格式字符串) 所以,觉得有必要记录下来,这样以后再次碰到这类问题,也能从中获取解答的思路.

随机推荐

  1. 移动端IM系统的协议选型:UDP还是TCP?(转)

    源: 移动端IM系统的协议选型:UDP还是TCP?

  2. Java基础 Scanner 使用nextInt接收整数

        JDK :OpenJDK-11      OS :CentOS 7.6.1810      IDE :Eclipse 2019‑03 typesetting :Markdown   code ...

  3. Docs-.NET-C#-指南-语言参考-关键字-值类型:内置数值转换

    ylbtech-Docs-.NET-C#-指南-语言参考-关键字-值类型:内置数值转换 1.返回顶部 1. 内置数值转换(C# 参考) 2019/10/22 C# 提供了一组整型和浮点数值类型. 任何 ...

  4. C++ STL中常见容器的时间复杂度和比较和分析

    C++ STL中常见容器的时间复杂度 map, set, multimap, and multiset 上述四种容器采用红黑树实现,红黑树是平衡二叉树的一种.不同操作的时间复杂度近似为: 插入: O( ...

  5. 零基础学Python-第一章 :Python介绍和安装-02.Python的发展历史与版本

    pthhon3.0对开发者带来了麻烦,因为2.0个3.0的程序并不是兼容的. 目前python3.0已经变成了真正的主力 官方版本和发行版 发行版会把常用的科学计算的包也给继承进来.这样就不用考虑包和 ...

  6. Linux记录-批量安装zabbix(转载)

    同一文件夹下建立pwd.txt,格式如下: ip username password ip username password #!/bin/bash cat pwd.txt | while read ...

  7. LintCode: coins in a line I

    有 n 个硬币排成一条线.两个参赛者轮流从右边依次拿走 1 或 2 个硬币,直到没有硬币为止.拿到最后一枚硬币的人获胜. 请判定 第一个玩家 是输还是赢? n = 1, 返回 true.n = 2, ...

  8. UML学习笔记:活动图

    UML学习笔记:活动图 活动图 活动图是UML中描述系统动态行为的图之一,用于展现参与行为的类的活动或动作.在UML里,活动图很类似于流程图,但是有一些区别: 活动图着重表现系统行为,描述对象活动的顺 ...

  9. 【VS开发】开发最小化到托盘的功能

    在VC++中,想实现最小化MFC程序的时候,最小化到系统托盘,需要调用NOTIFYICONDATA类 下面我们就来讲解一下如何简单实现一个系统托盘我们以对话框程序为列 第一步:在Dlg类中//定义一个 ...

  10. 【MPEG】DVB / ATSC / ISDB区别

    硬件的区别: 欧洲“DVB标准”和美国“ATSC数字电视标准”的主要区别如下: (1)方形像素:在ATSC标准中采纳了“方形像素”(Square Picture Eelements),因为它们更加适合 ...