我们都知道Oracle的Pivot的In()里是不能跟SQL查询语句的,必须是已知的字符串结果,然而我项目中遇到的需求这个In 并不是静态的,而是根据我传递的条件来筛选,一开始想的是解析XML,可惜转为XML之后,有相同的重复的节点,解析太麻烦,于是想通过动态sql,先把SQl查询结果再另一个函数里查询出来,再赋值给一个中间变量,作为参数传递到动态SQL里。
Pivot相关
在 Oracle 数据库 11g 推出之前,您需要针对每个值通过 decode 函数进行以上操作,并将每个不同的值编写为一个单独的列。但是,该方法一点也不直观。 庆幸的是,您现在可以使用一种很棒的新特性 PIVOT 通过一种新的操作符以交叉表格式显示任何查询,该操作符相应地称为 pivot。下面是查询的编写方式:
select * from (
select times_purchased, state_code
from customers t
pivot
count(state_code)
for state_code in ('NY','CT','NJ','FL','MO')
order by times_purchased
.
--------------- ---------- ---------- ---------- ---------- ----------
这表明了 pivot 操作符的威力。state_codes 作为标题行而不是列显示。下面是传统的表格化格式的图示:
动态SQL实现SQL查询子集行转列
CREATE OR REPLACE PROCEDURE p_Getgatherreprot37102(p_Provinceno IN VARCHAR2,
p_Cityno IN VARCHAR2,
p_Countryno IN VARCHAR2,
Ref_Cursor OUT SYS_REFCURSOR --返回的结果集,游标
v_Getstrulvlsql VARCHAR(4000) := '';
v_Getsql VARCHAR(4000) := '';
v_columnNames Varchar2(32767) :='';
BEGIN
--获取查询并拼接成一定格式的字符串 作为参数传递到动态SQL里
SELECT f_Concat_Name(p_Provinceno,p_Cityno,p_Countryno) INTO v_Getstrulvlsql FROM dual t;
v_Getsql := '
SELECT *
FROM (SELECT DISTINCT Cl.Levelno, Cl.Levelqualifiedratio
FROM Pdm_Ylzj_Crutoqualinspe c
LEFT JOIN Pdm_Ylzj_Crutosendinspe Sj
ON c.Pdm_Ylzj_Crutosendinspeid = Sj.Pdm_Ylzj_Crutosendinspeid
LEFT JOIN (SELECT X1.Pdm_Ylzj_Crutosendinspeid,
MAX(X1.Pdm_Ylzj_Crutoreporinspeid) AS Pdm_Ylzj_Crutoreporinspeid
FROM Pdm_Ylzj_Crutosendinsped X1
INNER JOIN Pdm_Ylzj_Crutoreporinspe X2
ON X1.Pdm_Ylzj_Crutoreporinspeid = X2.Pdm_Ylzj_Crutoreporinspeid
WHERE X2.State = 2
GROUP BY X1.Pdm_Ylzj_Crutosendinspeid) f
ON Sj.Pdm_Ylzj_Crutosendinspeid = f.Pdm_Ylzj_Crutosendinspeid
INNER JOIN Pdm_Ylzj_Crutolevelstruc Cl';
v_Getsql:=v_Getsql||' ON Cl.Pdm_Ylzj_Crutoqualinspeid = c.Pdm_Ylzj_Crutosendinspeid';
v_Getsql:=v_Getsql||' LEFT JOIN Pdm_Ylzj_Recrutoqualinspe Fj
ON Fj.Inspectionno = c.Inspectionno AND Nvl(Fj.Isdeleted, ''0'') = ''0''
WHERE Nvl(c.Isdeleted, 0) = 0 AND f.Pdm_Ylzj_Crutosendinspeid IS NULL AND
Fj.Pdm_Ylzj_Recrutoqualinspeid IS NULL AND Cl.Leveltype = ''1'' OR
Cl.Leveltype = ''2''
AND c.Provincesno = ''HB'' AND c.Cityno = ''ES'' AND c.Countyno = ''ES'')
Pivot(SUM(Levelqualifiedratio)';
v_Getsql:= v_Getsql || ' FOR Levelno IN('||v_Getstrulvlsql||'));';
execute Immediate v_Getsql Into Ref_Cursor;
END;
10月的第二天,前天写了个
Oracle
中
行转列
的
pivot
的基本使用方法,然后,因为
pivot
的用法中,正常情况下,我们需要转出多少个列,都得在我们的sql中完完整整地写出,而不能直接在里面写个查询来
动态
转换。然后,趁着祖国母亲的生日,这几天放假,整理一下处理方法。
一、运行环境
Win10,
Oracle
Database 11g r2,plsql 12。
二、效果预览
1、固定转换列的方...
oracle
中要
实现
行转列
的方式有很多种,比如case when …else …end 、wm_concat()函数,lag() over() 、lead() over() 函数等,以及11g版本后的
pivot
函数都可
实现
。可根据具体的需求选取不同的方式。
前两天恰好一朋友问起如何将如下表1
动态
转成表2的形式。
,channel_flag是查数据字典得到,值是变动的。当时第一反应是使用...
select *
from table_name1 a
pivot
(sum(nvl(citycode,0)) for co in (select distinct citycode from table_name1);
???????????????????????????????????????????????????????? ==>绝对报错.....
还有些文章用的只查询但是输出的是XML格式,本人愚钝
当初设计表的时候,指标、数据及公司在一张表里,现在要求列是
动态
维护的,也就是说需要多表关联,
实现
动态
行转列
,想了半天最后选择用
Oracle
存储过程加游标来做,下面把这个存储过程分享给大家,有不足的地方大家可以继续补充:
表1:数据存放表(bp_j_stat_ytz)
在Python中,我们可以使用列表的
子集
条件查询来有效地过滤和获取我们所需的数据。
最简单的列表
子集
条件查询是使用切片操作符。切片操作符可以针对列表的指定范围进行切片,从而获取列表的一个子列表。例如:
```python
list = [1, 2, 3, 4, 5]
subset = list[1:3] # subset = [2, 3]
这个例子中,我们通过指定索引范围 [1:3],获取了原列表 list 中从第 1 个索引元素开始,到第 3 个索引元素位置停止中间的元素。
其次,我们可以使用 Python 中的内置函数 filter() 来进行更复杂的列表
子集
条件过滤。filter() 函数可以在函数参数中指定一个函数和一个列表作为输入参数,该函数会对列表中的每个元素进行计算,并返回一个布尔值,接着 filter() 函数会返回输入列表中在函数计算结果为 True 的所有元素。例如:
```python
list = ['apple', 'banana', 'cherry', 'durian', 'eggplant']
subset = filter(lambda x: x.startswith('b') or x.startswith('c'), list) # subset = ['banana', 'cherry']
在这个例子中,我们定义了一个 lambda 表达式来检查列表中的每个元素的值是否以 'b' 或 'c' 开头,如果是,则返回 True。接着,我们传递这个 lambda 表达式和我们要过滤的列表 list 到 filter() 函数中,该函数返回了 list 中以 'b' 或 'c' 开头的元素。
总之,在Python中,列表
子集
条件查询是非常方便和快速的,可以大大提高我们的开发效率。列表切片和 filter() 函数是
实现
列表
子集
条件查询的两种主流方法,我们可以根据自己的需求选择使用合适的方法来完成任务。
Android进阶——Handler的应用之解决Only the original thread that created a view hierarchy can touch its views
39475