SELECT A.code,
..........
A.C_VALUE1 CVALUE1,
A.C_VALUE2 CVALUE2,
B.C_VALUE3 CVALUE3
from (select t.code,
t.c_value1,
to_char(wm_concat(t.c_value2)) c_value2
from t_ext t
where t.c_data_type = 'RELA'
group by t.code, t.c_value1) a
left join t_ext b
on a.code = b.code
and a.c_value1 = b.c_value1
and b.c_data_type = 'RELA'
同事针对上面SQL提出问题:
本来数据库是一个c_port_code 一个 c_value1 一个 c_value2存的, 现在想按照把 同一个 c_port_code 和 c_value1 的 c_value2合并为新的c_value2, 但是不想把c_value3和d_date放到分组里面,又需要这两个字段的值,导致重复数据了,该怎么去重呀
在a 的结果集,用了group by ,其实相当于将表“降维”了。假如原来1000行,现在分组后结果集变为100行了。 在b 的结果集,没用group by ,它还是原来的维度。 当它们left join时,肯定会再扩展回来呀,升维成为1000行。
再解释一下维度: 比如 商品表是一维表, 商品名称: 价格,产地,类别,备注
商品日销售表是二维表: 商品名称,日期: 购买人,购买数量,结账口......
如果你对“商品日销售表" group by 一下。 就相当于降维,体现在主键列减少了 商品名称 : 总购买数量
前面你让两个维度不同的表进行join,肯定引起某个表的扩展呀!
同事说他写了2个SQL来获取结果。
很多系统都会设计一个数据源的模块,往往止于”取到结果集“,其实拿到结果集只是第一步,更重要的是要反应出来结果集的行间的一个关系来。比较重要就是主键列,维度这些概念。
ORACLE本身也有维度的概念,我还没有把维度的概念理解透了,它直接关系着数据的汇总效率,数据视图的”上钻、下钻“,在echart里有上钻下钻功能,我不太清楚它是怎么维护数据关系的,有时间了要研究一下。
http://blog.csdn.net/wanghai__/article/details/6609193
Echarts文档:
http://echarts.baidu.com/option.html#series-line.dimensions