相关文章推荐
风流的啄木鸟  ·  Python ...·  1 年前    · 

我们都知道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
输出如下:
. TIMES_PURCHASED       'NY'       'CT'       'NJ'       'FL'       'MO'
--------------- ---------- ---------- ---------- ---------- ----------
              0      16601         90          0          0          0
              1      33048        165          0          0          0
              2      33151        179          0          0          0
              3      32978        173          0          0          0
              4      33109        173          0          1          0

这表明了 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
--获取查询并拼接成一定格式的字符串 作为参数传递到动态SQLSELECT f_Concat_Name(p_Provinceno,p_Cityno,p_Countryno) INTO v_Getstrulvlsql FROM dual t;
  v_Getsql := '--Open ref_cursor for
          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