按两列同时排序SQL

时间:2015-06-16 15:59:02

标签: mysql sql-server oracle11g

我有一个关于我的查询输出是如何排序的SQL问题。

以下是输出现在的样子:

REFERRED_FROM     REFERRED_FROM_COUNT     REFERRED_TO     REFERRED_TO_COUNT
sample            sample number
sample            sample number
sample            sample number
                                          sample          sample number
                                          sample          sample number
                                          sample          sample number

这是我想要的输出:

REFERRED_FROM     REFERRED_FROM_COUNT     REFERRED_TO     REFERRED_TO_COUNT
sample            sample number           sample          sample number
sample            sample number           sample          sample_number
sample            sample number           sample          sample number

我对SQL脚本很新,但我很确定这是可行的,我不知道为什么我无法理解它。

现在我的select语句中有4个case语句,以Referred_From,Referred_From_Count等结尾......我正在按Referred_From和id号排序。我的输出数据是正确的,然而格式化是关闭的。这是一个简单的解决方案,还是我必须重新做一下这个问题的基础?

在此先感谢,我期待着解决这个问题。

4 个答案:

答案 0 :(得分:1)

这是一个可能的解决方案:

SELECT referred_from, referred_from_count, referred_to, referred_to_count
FROM (
  SELECT referred_from, referred_from_count, rownum r
  FROM my_table
  WHERE referred_from IS NOT NULL
  AND referred_from_count IS NOT NULL
) t1
FULL OUTER JOIN (
  SELECT referred_to, referred_to_count, rownum r
  FROM my_table
  WHERE referred_to IS NOT NULL
  AND referred_to_count IS NOT NULL
) t2
ON t1.r = t2.r

另一种方法是使用JamesZ建议的ROW_NUMBER()窗口函数,但我怀疑它会慢一点:

SELECT referred_from, referred_from_count, referred_to, referred_to_count
FROM (
  SELECT referred_from, referred_from_count, ROW_NUMBER() OVER (ORDER BY id) r
  FROM my_table
  WHERE referred_from IS NOT NULL
  AND referred_from_count IS NOT NULL
) t1
FULL OUTER JOIN (
  SELECT referred_to, referred_to_count, ROW_NUMBER() OVER (ORDER BY id) r
  FROM my_table
  WHERE referred_to IS NOT NULL
  AND referred_to_count IS NOT NULL
) t2
ON t1.r = t2.r

答案 1 :(得分:1)

感谢您的帮助!我能够使用CTE最有效地完成它。我也用Lukas Eder的方式练习,所以感谢你发帖。

长话短说我做到了:

WITH ref_from as ........

WITH ref_to as ..........

SELECT Referred_From, Referred_From_Count, Referred_To, Referred_To_Count
FROM (select rownum rowfrom, ref_from.* from ref_from) t1,
     (select rownum rowto, ref_to.* from ref_to) t2
WHERE rowfrom = rowto;

我创建了' rowfrom'和' rowto'所以我有一些东西加入这两个并且它完美地工作。

再次感谢,我非常感谢这些提示。

答案 2 :(得分:0)

你需要将它们作为2个单独的结果集,并将row_number()添加到(它们的顺序为...)两个结果集,以便两个结果都有一个数字1,2 ... for想要的订单。

然后将结果集与行号连接,并使用完全外连接,以防它们中的任何一个包含更多行。

答案 3 :(得分:0)

我认为最好提供查询。看起来你正在尝试做类似的事情:

select Id, Referred_from ,COUNT(Referred_from),Referred_to,COUNT(Referred_to)
group by id, referred_from,referred_to
order by Id,referred_from