Oracle中一个列转行例子 -- a 1|2|3 转成: a 1 a 2 a 3 create table test( a1 varchar2(10),b1 varchar2(10)); insert into test(a1,b1) values('a','1,2,3'); commit;--方法1` select a1,regexp_substr(b1,'[^,]+',1,level) from test connect by level <= length(b1)-length(replace(b1,','))+1 --方法2 select a1,regexp_substr(b1,'[^,]+',1,level) from test connect by level <=length(regexp_replace(b1,'[^,]+')) +1 --方法3 select a1,regexp_substr(b1,'[^,]+',1,level) from test connect by level <=regexp_count(b1,',')+1
--如果统计一天24小时每个小时的数据量 --创建测试表 create table hour_test (add_hour date); --循环插入测试数据 declare n number; begin n:=0; while n<50000 loop n :=n+1; insert into hour_test select * from ( select rownum rn,to_date('2017-01-01', 'yyyy-mm-dd hh:mi:ss')+ rownum/24 add_hour from dual connect by rownum<25 ) a where a.rn =(select round(dbms_random.value(1,24)) from dual); end loop; commit; end ; --查询结果 select to_char(add_hour,'hh24') hour,count(*) n from hour_test group by to_char(add_hour,'hh24') order by to_char(add_hour,'hh24');
一些Tableau开发总结 1.占比: 相应度量字段上,添加表计算 计算类型选择"总额百分比",值汇总范围选择"表(向下)"可参考:各专业公司T+0产品客户情况统计及分析-注册时长(表格)2.面积图中的注册时长最高点和最低点 (1)添加注册时长(月) (度量) CUST_CNT_MONTH: {FIXED [客户注册时长(月)] : SUM([CUST_CNT])}(2)添加最大值和最小值 (度量) {EXCLUDE [客户注册时长(月)] : MAX({FIXED [客户注册时长(月)] : SUM([CUST_CNT])})} {EXCLUDE [客户注册时长(月)] : MIN({FIXED [客户注册时长(月)] : SUM([CUST_CNT])})}(3)添加计算字段,取最高点和最低点 (度量) IF [CUST_CNT_MONTH] = [CUST_CNT_MAX] OR [CUST_CNT_MONTH] = [CUST_CNT_MIN] THEN [CUST_CNT_MONTH] ELSE NULL END(4)以计算字段为度量绘制一个图,选择"圆",然后点击双轴可参考:各专业公司T+0产品客户情况统计及分析-注册时长(折线图)3.分级别统计问题(以年龄分布为例说明) (1)新增计算字段(维度)AGE_LEVEL(添加级别定义) IF [AGE] < 18 THEN '<18' ELSEIF [AGE] >= 18 AND [AGE] < 25 THEN '[18,25)' ELSEIF [AGE] >= 25 AND [AGE] < 30 THEN '[25,30)' ELSEIF [AGE] >= 30 AND [AGE] < 35 THEN '[30,35)' ELSEIF [AGE] >= 35 AND [AGE] < 40 THEN '[35,40)' ELSEIF [AGE] >= 40 AND [AGE] < 45 THEN '[40,45)' ELSE '>=45' END(2)添加各年龄客户数量计算字段(度量) CUST_CNT_AGE: CUS_CNT(3)对CUST_CNT_AGE添加表计算: 获取年龄层占比 计算类型选择"总额百分比",值汇总范围选择"表(向下)"(4)统计各年龄阶段人数的数量 度量) CUST_CNT_TOTAL: {EXCLUDE [AGE_LEVEL] : SUM([CUST_CNT])}(5)添加男性/女性人数计算字段(度量) CUST_CNT_FEMALE: IF [GENDER] = '女' THEN [CUST_CNT] ELSE 0 END CUST_CNT_MALE: IF [GENDER] = '男' THEN [CUST_CNT] ELSE 0 END(6)新增两个度量计算字段(度量),分别统计各年龄层男性/女性人数 CUST_CNT_AGE_FEMALE:{FIXED [AGE_LEVEL] : SUM([CUST_CNT_FEMALE])} CUST_CNT_AGE_MALE:{FIXED [AGE_LEVEL] : SUM([CUST_CNT_MALE])}(7)新增两个度量计算字段(添加男性/女性人数占比) CUST_CNT_FEMALE_PERCENT: [CUST_CNT_AGE_FEMALE] / [CUST_CNT_TOTAL] CUST_CNT_MALE_PERCENT: [CUST_CNT_AGE_MALE] / [CUST_CNT_TOTAL]可参考:各专业公司T+0产品客户情况统计及分析-注册时长(折线图)--DATETRUNC的使用 昨日: DATETRUNC('day',NOW()-1) 昨日数据: [统计日期] < DATETRUNC('day',NOW()) 最大日期: [统计日期] < DATETRUNC('day',{FIEXD: MAX(统计日期)}) 选择日期: [统计日期] = [数据日期CA01_3]--NOW() 年月日+时分秒 --TODAY() 年月日--添加{}使聚合函数和非聚合函数匹配: [统计日期] = {MAX([统计日期])}--默认取最新日期 IF [统计日期] = {MAX([统计日期])} THEN 'Last Date' ELSE STR(DATEPART('year',[统计日期]))+'-'+STR(DATEPART('month',[统计日期]))+'-'+STR(DATEPART('day',[统计日期])) END--默认取最新日期2 创建计算字段1:{FIXED [Time]: max(year([Date])*100+month([Date]))} --[Month] 创建计算字段2:year([Date])*100+month([Date]) --[latest month] 创建字符串参数: [是否最新日期],默认值为'否' 创建计算字段3: [是否最新日期] = "否" or [Month] = [latest month] 然后将[统计日期]和[是否最新日期] 拖到筛选器中.--合计值排序: IF [迁徙路径] = '合计' THEN 1 ELSE 0 END; 接着编辑[迁徙路径]的排序规则,下来选择"合计值排序"字段,点击"最小值"--负值突出显示: IF LEFT([字段],1) = '-' THEN 1 ELSE 0 END 接着把"负值突出显示"字段拖放到颜色,编辑显示目标颜色即可 重复值高亮显示: IF { FIEXD [计算字段]: COUNT([计算字段])} > 1 THEN 1 ELSE 0 END--负值去掉-,换成()显示: IF LEFT([字段],1) = '-' THEN '('+REPLACE([字段],'-','')+')' ELSE [字段] END 替换掉之前的字段
-- a 1|2|3
转成:
a 1
a 2
a 3
create table test( a1 varchar2(10),b1 varchar2(10));
insert into test(a1,b1) values('a','1,2,3');
commit;--方法1`
select a1,regexp_substr(b1,'[^,]+',1,level)
from test
connect by level <= length(b1)-length(replace(b1,','))+1
--方法2
select a1,regexp_substr(b1,'[^,]+',1,level)
from test
connect by level <=length(regexp_replace(b1,'[^,]+')) +1
--方法3
select a1,regexp_substr(b1,'[^,]+',1,level)
from test
connect by level <=regexp_count(b1,',')+1
--创建测试表
create table hour_test (add_hour date);
--循环插入测试数据
declare n number;
begin
n:=0;
while n<50000 loop
n :=n+1;
insert into hour_test
select * from (
select rownum rn,to_date('2017-01-01', 'yyyy-mm-dd hh:mi:ss')+ rownum/24 add_hour
from dual
connect by rownum<25
) a
where a.rn =(select round(dbms_random.value(1,24)) from dual);
end loop;
commit;
end ;
--查询结果
select to_char(add_hour,'hh24') hour,count(*) n from hour_test
group by to_char(add_hour,'hh24')
order by to_char(add_hour,'hh24');
1.占比: 相应度量字段上,添加表计算
计算类型选择"总额百分比",值汇总范围选择"表(向下)"可参考:各专业公司T+0产品客户情况统计及分析-注册时长(表格)2.面积图中的注册时长最高点和最低点
(1)添加注册时长(月) (度量)
CUST_CNT_MONTH: {FIXED [客户注册时长(月)] : SUM([CUST_CNT])}(2)添加最大值和最小值 (度量)
{EXCLUDE [客户注册时长(月)] : MAX({FIXED [客户注册时长(月)] : SUM([CUST_CNT])})}
{EXCLUDE [客户注册时长(月)] : MIN({FIXED [客户注册时长(月)] : SUM([CUST_CNT])})}(3)添加计算字段,取最高点和最低点 (度量)
IF [CUST_CNT_MONTH] = [CUST_CNT_MAX] OR [CUST_CNT_MONTH] = [CUST_CNT_MIN]
THEN [CUST_CNT_MONTH] ELSE NULL END(4)以计算字段为度量绘制一个图,选择"圆",然后点击双轴可参考:各专业公司T+0产品客户情况统计及分析-注册时长(折线图)3.分级别统计问题(以年龄分布为例说明)
(1)新增计算字段(维度)AGE_LEVEL(添加级别定义)
IF [AGE] < 18 THEN '<18'
ELSEIF [AGE] >= 18 AND [AGE] < 25 THEN '[18,25)'
ELSEIF [AGE] >= 25 AND [AGE] < 30 THEN '[25,30)'
ELSEIF [AGE] >= 30 AND [AGE] < 35 THEN '[30,35)'
ELSEIF [AGE] >= 35 AND [AGE] < 40 THEN '[35,40)'
ELSEIF [AGE] >= 40 AND [AGE] < 45 THEN '[40,45)'
ELSE '>=45' END(2)添加各年龄客户数量计算字段(度量)
CUST_CNT_AGE: CUS_CNT(3)对CUST_CNT_AGE添加表计算: 获取年龄层占比
计算类型选择"总额百分比",值汇总范围选择"表(向下)"(4)统计各年龄阶段人数的数量 度量)
CUST_CNT_TOTAL: {EXCLUDE [AGE_LEVEL] : SUM([CUST_CNT])}(5)添加男性/女性人数计算字段(度量)
CUST_CNT_FEMALE: IF [GENDER] = '女' THEN [CUST_CNT] ELSE 0 END
CUST_CNT_MALE: IF [GENDER] = '男' THEN [CUST_CNT] ELSE 0 END(6)新增两个度量计算字段(度量),分别统计各年龄层男性/女性人数
CUST_CNT_AGE_FEMALE:{FIXED [AGE_LEVEL] : SUM([CUST_CNT_FEMALE])}
CUST_CNT_AGE_MALE:{FIXED [AGE_LEVEL] : SUM([CUST_CNT_MALE])}(7)新增两个度量计算字段(添加男性/女性人数占比)
CUST_CNT_FEMALE_PERCENT: [CUST_CNT_AGE_FEMALE] / [CUST_CNT_TOTAL]
CUST_CNT_MALE_PERCENT: [CUST_CNT_AGE_MALE] / [CUST_CNT_TOTAL]可参考:各专业公司T+0产品客户情况统计及分析-注册时长(折线图)--DATETRUNC的使用
昨日: DATETRUNC('day',NOW()-1)
昨日数据: [统计日期] < DATETRUNC('day',NOW())
最大日期: [统计日期] < DATETRUNC('day',{FIEXD: MAX(统计日期)})
选择日期: [统计日期] = [数据日期CA01_3]--NOW() 年月日+时分秒
--TODAY() 年月日--添加{}使聚合函数和非聚合函数匹配: [统计日期] = {MAX([统计日期])}--默认取最新日期
IF [统计日期] = {MAX([统计日期])} THEN 'Last Date'
ELSE
STR(DATEPART('year',[统计日期]))+'-'+STR(DATEPART('month',[统计日期]))+'-'+STR(DATEPART('day',[统计日期]))
END--默认取最新日期2
创建计算字段1:{FIXED [Time]: max(year([Date])*100+month([Date]))} --[Month]
创建计算字段2:year([Date])*100+month([Date]) --[latest month]
创建字符串参数: [是否最新日期],默认值为'否'
创建计算字段3: [是否最新日期] = "否" or [Month] = [latest month]
然后将[统计日期]和[是否最新日期] 拖到筛选器中.--合计值排序:
IF [迁徙路径] = '合计' THEN 1 ELSE 0 END; 接着编辑[迁徙路径]的排序规则,下来选择"合计值排序"字段,点击"最小值"--负值突出显示:
IF LEFT([字段],1) = '-' THEN 1 ELSE 0 END 接着把"负值突出显示"字段拖放到颜色,编辑显示目标颜色即可
重复值高亮显示: IF { FIEXD [计算字段]: COUNT([计算字段])} > 1 THEN 1 ELSE 0 END--负值去掉-,换成()显示:
IF LEFT([字段],1) = '-' THEN '('+REPLACE([字段],'-','')+')' ELSE [字段] END 替换掉之前的字段