2013-07-10 125 views
0

我有一个表有点像这样的结构:如何执行组合具有相同值的行作为组?

date name marks 
x  a  4 
y  a  2 
x  b  2 
y  b  7 
x  c  8 
y  c  6 
x  d  9 
y  d  6 

我想所有的行进行合并,但是,相同的name应被视为一个在执行组合。输出看起来像:

date name marks x.date x.name x.marks 
x  a  4  x  b  2 # a & b 
y  a  2  y  b  7 
x  a  4  x  c  8 # a & c 
y  a  2  y  c  6 
x  a  4  x  d  9 # a & d 
y  a  2  y  d  6 
x  b  2  x  d  9 # b & c 
y  b  7  y  d  6 
x  b  2  x  c  8 # b & d 
y  b  7  y  c  6 
x  c  8  x  d  9 # c & d 
y  c  6  y  d  6 

我已经厌倦了像交叉连接,分组等等各种ide,但都是徒劳。任何帮助?

回答

1
Select a.date adate, a.name aname, a.marks amark, 
x.date xdate, x.name xname, x.marks xmarks 
FROM A a, a x 
where A.name < x.Name and a.date = x.date 
order by aname, xname, adate, xdate 

这里是一个工作演示的小提琴。 http://sqlfiddle.com/#!2/105f0/19/0

但是在将来会显示你的工作。您尝试过的后期查询,以便人们可以指引您正确的方向。

这里的诀窍是两倍你想A.name是< x.name但只有当a.date和x.dates匹配时。所以需要交叉连接,但你不想简单地使用<>或=

+0

可爱!我也在尝试你的代码http://sqlfiddle.com/#!2/b24959/1好吧,我被困在这个概率上差不多一个月了,最后你在短短的几分钟内就完成了!哇!谢谢你百万:) –

+1

是啊我的订单是不完整的那个小提琴,我纠正它,以符合您更新之一所需的输出。诀窍是想想生成的cartesean,然后可以做些什么来消除你不想要的行。一旦我看到输出中没有D名称作为输出中的第一个名字,我知道我必须在where子句中使用 xQbert

+0

啊!你简直就是天才! Stackoverflow岩石的像你一样的编码员的:) –

相关问题