查看: 5698|回复: 15

[SQL] 【讨论】请教高手,多列空行排除的问题?

[复制链接]
论坛徽章:
1
优秀写手
日期:2014-03-12 06:00:13
发表于 2015-1-30 10:50 | 显示全部楼层 |阅读模式
实际内容有12列20多行,现将问题简化
with t as (
select 'aaa' as 商品1,123 as 销量1,null as 商品2,null as 销量2,null as 商品3,null as 销量3 from dual
  union
select null as 商品1,null as 销量1,'bbb' as 商品2,234 as 销量2,null as 商品3,null as 销量3 from dual
   union
select null as 商品1,null as 销量1,null as 商品2,null as 销量2,'ccc' as 商品3,456 as 销量3 from dual
union
select  'ddd' as 商品1,789 as 销量1,null as 商品2,null as 销量2,null as 商品3,null as 销量3 from dual
  union
select  null as 商品1,null as 销量1,'eee' as 商品2,890 as 销量2,null as 商品3,null as 销量3 from dual

)

select * from t
…………运行结果如下…………。

商品1销量1商品2销量2商品3销量3
aaa
123
ddd
789
bbb
234
eee
890
ccc
456


要求通过SQL语旬查询得到下面的结果
商品1销量1商品2销量2商品3销量3
aaa
123
bbb
234
ccc
456
ddd
789
eee
890


论坛徽章:
1
美羊羊
日期:2015-03-28 00:45:30
发表于 2015-1-30 11:27 | 显示全部楼层
写了个愚笨的方法,期待大神出现。
with t as (
select 'aaa' as 商品1,123 as 销量1,null as 商品2,null as 销量2,null as 商品3,null as 销量3 from dual
  union
select null as 商品1,null as 销量1,'bbb' as 商品2,234 as 销量2,null as 商品3,null as 销量3 from dual
   union
select null as 商品1,null as 销量1,null as 商品2,null as 销量2,'ccc' as 商品3,456 as 销量3 from dual
union
select  'ddd' as 商品1,789 as 销量1,null as 商品2,null as 销量2,null as 商品3,null as 销量3 from dual
  union
select  null as 商品1,null as 销量1,'eee' as 商品2,890 as 销量2,null as 商品3,null as 销量3 from dual
),
T1 AS
(SELECT T.商品1,T.销量1,ROWNUM AS RN FROM T WHERE T.商品1 IS NOT NULL AND T.销量1 IS NOT NULL)
,T2 AS
(SELECT T.商品2,T.销量2,ROWNUM AS RN FROM T WHERE T.商品2 IS NOT NULL AND T.销量2 IS NOT NULL)
,T3 AS
(SELECT T.商品3,T.销量3,ROWNUM AS RN FROM T WHERE T.商品3 IS NOT NULL AND T.销量3 IS NOT NULL)
SELECT * FROM T1,T2,T3 WHERE T1.RN=T2.RN(+) AND T1.RN=T3.RN(+)


使用道具 举报

回复
论坛徽章:
737
季节之章:春
日期:2015-07-31 17:16:29ITPUB季度 技术新星
日期:2014-07-17 14:37:00季节之章:秋
日期:2015-07-31 17:16:14季节之章:夏
日期:2015-07-31 17:16:29股神
日期:2014-10-15 09:23:31衰神
日期:2014-10-20 22:47:12季节之章:冬
日期:2015-07-31 17:16:14红钻
日期:2014-12-16 17:51:41洛杉矶湖人
日期:2016-09-23 08:18:15布鲁克林篮网
日期:2016-09-23 08:17:18
发表于 2015-1-30 11:47 | 显示全部楼层
excel搞

使用道具 举报

回复
论坛徽章:
126
ITPUB元老
日期:2007-07-04 17:27:50会员2007贡献徽章
日期:2007-09-26 18:42:10现任管理团队成员
日期:2011-05-07 01:45:08优秀写手
日期:2015-01-09 06:00:14版主7段
日期:2015-07-16 02:10:00
发表于 2015-1-30 11:51 | 显示全部楼层



如果你目前的表的数据有如下的呈现规律,即
“列商品n的有值是接着上个商品n-1无值的话”, 如下语句可以完成,只不过每次表多一列新的商品4或商品5, 你都要成对的写cnt4或cnt5, 并且外层的也要成对的写lead(商品4, cnt1 + cnt2 + cnt4) over(order by rn) 商品4, 类似的即可!
如果表的数据是没有这种规律的,那实现的效率就非常差了

SQL> select * from t2;

商品1      销量1 商品2      销量2 商品3      销量3
----- ---------- ----- ---------- ----- ----------
aaa          123                        
ddd          789                        
                 bbb          234      
                 eee          890      
                                  ccc          456

SQL>
SQL> select  商品1,
  2          销量1,
  3          商品2,
  4          销量2,
  5          商品3,
  6          销量3
  7  from
  8  (select rn,
  9          商品1,
10          销量1,
11          lead(商品2, cnt1) over(order by rn) 商品2,
12          lead(销量2, cnt1) over(order by rn) 销量2,
13          lead(商品3, cnt1 + cnt2) over(order by rn) 商品3,
14          lead(销量3, cnt1 + cnt2) over(order by rn) 销量3
15  from
16  (select rownum rn,
17          商品1,
18          销量1,
19          count(商品1) over() cnt1,
20          商品2,
21          销量2,
22          count(商品2) over() cnt2,
23          商品3,
24          销量3
25     from t2))
26  where 商品1 is not null;

商品1      销量1 商品2      销量2 商品3      销量3
----- ---------- ----- ---------- ----- ----------
aaa          123 bbb          234 ccc          456
ddd          789 eee          890      

SQL>




使用道具 举报

回复
论坛徽章:
126
ITPUB元老
日期:2007-07-04 17:27:50会员2007贡献徽章
日期:2007-09-26 18:42:10现任管理团队成员
日期:2011-05-07 01:45:08优秀写手
日期:2015-01-09 06:00:14版主7段
日期:2015-07-16 02:10:00
发表于 2015-1-30 11:54 | 显示全部楼层
oracle_cj 发表于 2015-1-30 11:47
excel搞

不错的思路,呵呵,如果是这样的话,客户自己直接搞定!现在很多客户认为在excel能实现的所有功能, 数据库也应该非常简单的来实现, 因此从事数据库开发的人员被鄙视的情况非常多啊!

使用道具 举报

回复
求职 : 数据库管理员
招聘 : Java研发
认证徽章
论坛徽章:
6348
ITPUB9周年纪念徽章
日期:2014-05-02 10:36:402011新春纪念徽章
日期:2014-12-29 12:11:142010广州亚运会纪念徽章:卡巴迪
日期:2014-08-06 08:44:252012新春纪念徽章
日期:2014-12-29 12:11:142013年新春福章
日期:2014-12-29 12:11:14马上有车
日期:2014-12-29 12:11:14马上有房
日期:2014-12-29 12:11:14马上有钱
日期:2014-12-29 12:11:14马上有对象
日期:2014-12-29 12:11:14马上加薪
日期:2014-12-29 12:11:14
发表于 2015-1-30 12:53 | 显示全部楼层
oracle_cj 发表于 2015-1-30 11:47
excel搞

经典回复...
好多帖子都见此回复

使用道具 举报

回复
论坛徽章:
737
季节之章:春
日期:2015-07-31 17:16:29ITPUB季度 技术新星
日期:2014-07-17 14:37:00季节之章:秋
日期:2015-07-31 17:16:14季节之章:夏
日期:2015-07-31 17:16:29股神
日期:2014-10-15 09:23:31衰神
日期:2014-10-20 22:47:12季节之章:冬
日期:2015-07-31 17:16:14红钻
日期:2014-12-16 17:51:41洛杉矶湖人
日期:2016-09-23 08:18:15布鲁克林篮网
日期:2016-09-23 08:17:18
发表于 2015-1-30 13:00 来自手机 | 显示全部楼层
2009532140 发表于 2015-1-30 12:53
经典回复...
好多帖子都见此回复

在excel 里面搞好,不管用vb还是直接写入数据库都挺方便!数据量小挺好的

使用道具 举报

回复
论坛徽章:
1
优秀写手
日期:2014-03-12 06:00:13
 楼主| 发表于 2015-1-30 14:23 | 显示全部楼层
学习了,多谢大家,用EXCEL是不现实的,实际数据很多,而且每时都在发生变化

使用道具 举报

回复
认证徽章
论坛徽章:
6
2014年世界杯参赛球队: 阿尔及利亚
日期:2014-07-24 11:05:12马上有钱
日期:2014-10-17 22:07:27复活蛋
日期:2014-12-01 15:10:24红孩儿
日期:2015-01-09 11:05:202015年新春福章
日期:2015-03-04 14:55:132015年新春福章
日期:2015-03-06 11:59:47
发表于 2015-1-30 15:15 | 显示全部楼层
oracle_cj 发表于 2015-1-30 11:47
excel搞

不错。

使用道具 举报

回复
认证徽章
论坛徽章:
6
2014年世界杯参赛球队: 阿尔及利亚
日期:2014-07-24 11:05:12马上有钱
日期:2014-10-17 22:07:27复活蛋
日期:2014-12-01 15:10:24红孩儿
日期:2015-01-09 11:05:202015年新春福章
日期:2015-03-04 14:55:132015年新春福章
日期:2015-03-06 11:59:47
发表于 2015-1-30 15:15 | 显示全部楼层
oracle_cj 发表于 2015-1-30 11:47
excel搞

好主意

使用道具 举报

回复

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

TOP技术积分榜 社区积分榜 徽章 团队 统计 知识索引树 积分竞拍 文本模式 帮助
  ITPUB首页 | ITPUB论坛 | 数据库技术 | 企业信息化 | 开发技术 | 微软技术 | 软件工程与项目管理 | IBM技术园地 | 行业纵向讨论 | IT招聘 | IT文档
  ChinaUnix | ChinaUnix博客 | ChinaUnix论坛
CopyRight 1999-2011 itpub.net All Right Reserved. 北京盛拓优讯信息技术有限公司版权所有 联系我们 
京ICP备09055130号-4  北京市公安局海淀分局网监中心备案编号:11010802021510 广播电视节目制作经营许可证:编号(京)字第1149号
  
快速回复 返回顶部 返回列表