关于SQL相同表分组排列组合的问题

如图所示,想通过左边表得到右边表结果,左边分组列 组数量不定!
没有人回答,用了一种笨方法,动态SQL拼接,先横向再纵向!

    建两个序列,并通过一个函数调用序列(union 不支持直接使用序列),用于排序。

    先用第二组所有行(3行),union all 3遍第一组第一行(left join 第二组,行数就和第二组一样了)

    在用第二组所有行(3行),union all 3遍第一组第二行(left join 第二组,行数就和第二组一样了)

    最后按照序号,组别,编号排序

/*
drop sequence Big_Letter1;
Create sequence Big_Letter1
Increment by 1
Start with 65
Maxvalue 999999
Minvalue 1
Nocycle
nocache;

drop sequence Big_Letter2;
Create sequence Big_Letter2
Increment by 1
Start with 65
Maxvalue 999999
Minvalue 1
Nocycle
nocache;

--获取数列下一个值
create or replace function get_seq_next (seq_name in varchar2) return number
is
  seq_val number ;
begin
  execute immediate 'select '|| seq_name|| '.nextval from dual' into seq_val ;
  return seq_val ;
end get_seq_next;

*/

with tmp as (
select '1' groupid,'1' num from dual
union
select '1','2' from dual
union
select '2','1' from dual
union
select '2','2' from dual
union
select '2','3' from dual
)
select chr(get_seq_next('Big_Letter1')) xuhao,t1.groupid ,t1.num
from tmp t1 where groupid='2'
union all
select chr(get_seq_next('Big_Letter2')) xuhao,t1.groupid ,t1.num
from tmp t1,tmp t2 
where t1.groupid='1' and t1.num='1' and t2.groupid='2'
union
select chr(get_seq_next('Big_Letter1')) xuhao,t1.groupid ,t1.num
from tmp t1 where groupid='2'
union all
select chr(get_seq_next('Big_Letter2')) xuhao,t1.groupid ,t1.num
from tmp t1,tmp t2 
where t1.groupid='1' and t1.num='2' and t2.groupid='2'
order by xuhao,groupid,num

执行结果如下:

按照这个思路拼动态SQL吧

温馨提示:内容为网友见解,仅供参考
第1个回答  2018-03-29
select
    a.组别
    ,b.编号
from
    左边表名 a
    ,左边表名 b

以上语句可以实现组别和编号的各种组合,若是需要去除重复,可以使用Distinct

求SQL语句可以查询2个字段的组合的不重复结果,注意是排列组合的...
例:表名为T SQL语句为:SELECT t1.A AS A,t1.B AS B, t1.C+t2.C AS C FROM (SELECT * FROM (SELECT A, B, Sum(T.C) AS C FROM T GROUP BY T.A, T.B )AS t1,(SELECT A, B, Sum(T.C) AS C FROM T GROUP BY T.A, T.B )AS t2 WHERE t1.A=t2.B AND t1...

SQL进阶技巧——自连接的用法全解!
1. 排列与组合例如,通过自连接,我们可以从商品表中生成所有商品的有序对,包括所有可能的排列组合。但需要注意区分有序对(如“苹果,橘子”)和无序对(如{苹果,橘子}),并理解自连接如何处理顺序和重复元素。2. 删除重复行对于无主键的重复行,自连接与关联子查询结合,能有效地识别和去除重复数...

请教关于排列组合的计算pl\/sql如何写
大写字母C,下标n,上标m,(这里打不出上下标,就打成C(n.m))表示从n个元素中取出m 个元素的不同的方法数.如从5个人中选2人去开会,不同的选法有C(5,2)=10种.C(n,m)的计算方法是C(n,m)=n!\/[m!(n-m)!]=n*(n-1)*...*(n-m+1)\/[1*2*...*m],如C(5,2)=[5*4]\/[...

SQL语句中的 Distinct 和 Group by 有什么不同,用那个好?
王五```935 这是将全部字段都进行了所有的排列组合,即:笛卡尔积!要防止这个情况的发生,我们就可以用到group by(分组)了!select xm, sum(je)from tab_1 group by xm;上面的SQL指定了用xm字段分组,这样一来就返回出正确的结果了:张三```1250 李四```850 王五```935 === ★★★例子2...

SQL server中的表, 最大行数和列数分别是多少?
方法二:(A-Z)+(AA-ZZ)+(AAA-WZZ)+(AA-EZ)+(A-D) 26+26*26+23*26*26+5*26+4 = 16 384 aess最大列数与最大行数是多少 Aess与Excel不太一样。Aess资料表的最大栏位(相当于Excel的列)数是255个,最大记录(相当于Excel的行)数没有限制,只受每个档案不超过2G的限制。excel...

mysql中group by里面的问题
GROUP BY dept,name 的意思,就是先按dqpt分组,如果出现dept相同的,再按name分组,也就是说除非出现dept和name都相同的记录才会合为一组,否则的话是不会合在一起的,这样的话显示出的name就只有一个了。你用现实生活中的例子来理解一下就很明白啦:比如说你们班上的同学如果按性别来分组,可以...

俩个表之间没有ID联系,该怎么用sql语句查询呢?
没有ID联系的话, 假如又不加条件。 那么结果就是2个表的 排列组合。例如:CREATE TABLE [T1] (name varchar(10));go CREATE TABLE [T2](name varchar(10));go INSERT INTO T1 SELECT '东' UNION ALL SELECT '南' UNION ALL SELECT '西' UNION ALL SELECT '北'go INSERT INTO T2 SELECT...

怎样用Excel排列组合解决该问题
打开"排列组合.XLS"2 打开"Microsoft Query"3 选择数据源:EXCEL FILES*,不要勾选"使用查询向导" 确定 打开存放在电脑E:盘上的"排列组合.xls"文件,作为外部数据源 添加"职员$"工作表到Query,并关闭 点击Query工具栏中"SQL"按钮 填写如下SQL语句:select from [职员$] A,[职员$] B,[职员$] C ...

数据库SQL模糊匹配查询,求求求
然后SQL语句为 SQL = select 表别名.你的字段名 from 表 as 表别名 where 表别名.条件字段名 like '%变量%';例:<表名为:abc,存放地名的字段为:xyz> String Str = "惠州";String StrSQL = "select a.xyz as add from abc as a where a.xyz like "'%"+Str+"%'";...

HiveQL 进阶之以柔克刚 - 将简单语法运用到极致
核心思路是从所有省份列表中不重复地取出 2 个省份,生成所有的组合结果,然后关联 visit_log 表分组统计结果。SQL 实现--?SQL?-?2select???t.pos?as?a_nfrom?(???select?posexplode(split(space(3),?space(1)))?t;6 对比组省份用户访问量四川-湖北四川1四川-湖北湖北3四川-湖南四川1四川-湖南湖南2湖北...

相似回答