问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

sql横向查询

发布网友 发布时间:2022-05-02 11:30

我来回答

2个回答

懂视网 时间:2022-05-02 15:52

技术分享图片

但是这种显示结果也许并不清晰,想想如果把月份横着排列是不是更清晰,若用一般方法我们可以这样写:

select 
 prd_type_id, 
 sum(decode(month, 1, amount, 0)) as JAN,
 sum(decode(month, 2, amount, 0)) as FEB,
 sum(decode(month, 3, amount, 0)) as MAR,
 sum(decode(month, 4, amount, 0)) as APR
 from all_sales 
 where prd_type_id in(1, 2, 3) group by prd_type_id;

--不熟悉decode函数的可以用一下方法

select 
 prd_type_id,
 sum(case when month = 1 then amount else 0 end) as JAN,
 sum(case when month = 2 then amount else 0 end) as FEB,
 sum(case when month = 3 then amount else 0 end) as MAR,
 sum(case when month = 4 then amount else 0 end) as APR
from all_sales
where prd_type_id in (1, 2, 3)
group by prd_type_id;

技术分享图片

这样显示是不是更好呢?但是现在oracle 11g为我们提供了更好的方法, 那就是pivot,他可以将行变成列:

select *
from (
-- ①
 select month, prd_type_id, amount
 from all_sales
 where year = 2003
 and prd_type_id in(1, 2, 3)
)
pivot(
-- ②
 sum(amount) for month in (1 as JAN, 2 as FEB, 3 as MAR, 4 as APR)
)
order by prd_type_id;

执行结果同上图; 
接下来,我将讲讲这些代码的含义(只是个人理解):

对于①我的理解是,这部分限定了数据的范围,这个范围怎么确定呢,首先你得知道你想显示什么。在本文中,你需要显示prd_type_id, month, amount三种数据,所以就可以确定了;

对于②我的理解是,这部分规定了如何将行变成列;对于sum(amount)的含义,我们先放放,先说说这个month,他就规定了把什么变成从行变成列了,那么in后面的部分,则规定了,哪些month需要变成列,而as规定了别名,可以省略。那么对于sum(amount)怎么理解呢,首先他必须是聚合操作,他就是要在每一个month列下要显示的数据,拿一月来说,他下面的数据肯定不止一条,这也是为什么要使用聚合函数的原因了, 他到底对得是哪些amount的求和?我们知道在本题中,还有些列并未转成行,那么这些列同上面的月份便共同规定了对哪些amount求和了,如一月与id=1对应的那个格子,就是所有满足月份为一月,而类型id为1的数据了;

转换多个列

我们都知道for后面规定了哪些行将被转换为列,而in里面规定了要将哪些特定的行转换,有了这些,我们便不能理解下面的sql:

select *
from (
 select month, prd_type_id, amount
 from all_sales
 where year = 2003 and prd_type_id in(1,2,3)
)
pivot (
 sum(amount) for(month, prd_type_id) in(
 (1, 1) as jan_prd_type_1,
 (2, 2) as feb_prd_type_2,
 (3, 3) as mar_prd_type_3,
 (4, 2) as apr_prd_type_2
 )
);

 

技术分享图片

在转换中使用多个聚合函数

select *
 from (
 select month, prd_type_id, amount
 from all_sales
 where year = 2003
 and prd_type_id in(1, 2, 3)
 )
 pivot (
 sum(amount) as sum_amount,
 avg(amount) as avg_amount
 for(month) in(
  1 as JAN, 2 as FEB
 )
 )
order by prd_type_id;

 

技术分享图片

值得注意的是系统会自动将两个别名合为一个;

unpivot子句

unpivot子句的作用是将列转换为行。

现有表格数据如下: 
技术分享图片

select * from pivot_sales_data 
unpivot(
 amount for month in (jan, feb, mar, apr)
)
order by prd_type_id;

 

技术分享图片

SQL(横表和纵表)行列转换,PIVOT与UNPIVOT的区别和使用方法举例

标签:注意   span   print   log   旋转   ber   tty   aggregate   group   

热心网友 时间:2022-05-02 13:00

你确定?????
是想这样吧?
select name
,max(case when kemu='yuwen' then score else 0 end) as yuwen
, max(case when kemu='shuxue' then score esle 0 end) as shuxue
, max(case when kemu='yingyu' then score esle 0 end) as yingyu
。。。
from table_name
group by name
如果不是想这样可以再找我
不过我今天没空理你了,最快也到明天了 呵呵
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
长沙到西昌。坐火车先从长沙到成都、成都东,再到西昌,哪个方便一些 S先生与P先生谜题的题面 为什么首都设在襄阳 改姓可以不随父母性吗 韩艺瑟怎么改姓? 纸、墨、笔、砚是中国传统的文房四宝,墨的使用最早在 [ ] A.商代后期... 想问下创维光伏E企赢模式有哪些优势,到底值不值得投资啊?有没有合作... 太平洋太享e保百万医疗值得入手吗?每年花多少钱? 爱e满分适合哪些人买?注意哪些问题? 太平洋太享e保百万医疗适合哪些人买?价格多少? 泰国人妖皇后照片,她真的是男人么? 人妖POY唱的歌曲名字 泰国电视剧天使之争里面有没有人妖 关于Manson的音乐 天使和恶魔可以在一起吗 黑执事问题 马雷.曼森档案?看过他的很多另类照片,知道他唱歌和画画,想知道他详细些的资料,谢谢! 腾讯人工电话能打通吗? 平安车险上海总部电话是多少钱 怀孕了要去医院做什么检查? 平安车险上海总部电话 上海平安车险电话号码是多少 上海车险代理电话号码 迷你世界地心人我打他他既然跑,不跟我打什么情况? 迷你世界怎么样制作地心之眼? 一加9r支持vooc闪充吗? 上海电话车险电话号码 一加9R能6a数据线充电吗 vivox20怎么关闭自动更新 怎么让ViVo手机停止更新 假表也可以扫防伪码对吗? 买了一块威利默克手表,怎么查防伪啊? 雷诺手表防伪标识怎么查 请问长这种斑的鸡蛋还能吃吗? 灌汤烧麦怎么做 牛肉烧麦的制作方法和馅料的调制方法 S是什么档 高分求烧卖的做法,让我看的懂,做的出哦,谢谢了 发面烧卖的做法步骤图,发面烧卖怎么做好吃 请大家点开大图帮着看下最近朋友圈有人发这样的黄豆表情,是从哪里设置来的?求教谢谢! 你好!为什么我的支付宝转账和收款的二维码不能用了呢? 各种小黄豆表情 支付宝转账转不了付钱也付不了 求小黄豆表情包,要特别搞怪特别可爱的~ 平安银行的经营贷款需需要什么条件 黄豆表情大全打包~ 现在支付宝怎么不能转账了 经典黄豆表情就是默认表情的各种合成版本求这个表情包 谢谢! 求小黄豆表情包 谢谢! 支付宝账户不存在或者设置了隐私保护只能扫码付款不能转账这种账户安全吗?