【问题标题】:Order By Two Columns Simultaneously SQL同时按两列排序 SQL
【发布时间】:2015-09-01 13:40:41
【问题描述】:

我有一个关于查询输出排序方式的 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 号排序。我的输出数据是正确的,但是格式是关闭的。这是一个简单的解决方案,还是我必须重新制定我如何解决这个问题的基础?

提前致谢,我期待着解决这个问题。

【问题讨论】:

  • 您将无法仅通过订购来做到这一点。您将不得不更改您的选择语句
  • 这不仅仅是一个“订购”问题。您正在显示您的查询正在返回 six 行;不能使用 ORDER BY 子句转换为 行。 (您无法弄清楚如何做到这一点,因为这是不可能的。)您需要对查询进行更重大的更改,或处理客户端中结果的“重新格式化”。

标签: mysql sql-server oracle11g


【解决方案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

【讨论】:

    【解决方案2】:

    感谢大家的帮助!我能够使用 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”,因此我可以将两者结合起来,并且效果很好。

    再次感谢,非常感谢您的提示。

    【讨论】:

      【解决方案3】:

      您需要将它们作为 2 个单独的结果集,并将 row_number() 添加到它们(按...排序),以便两个结果都有一个数字 1,2...通缉令。

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

      【讨论】:

      • 这就是你在SQL Server中的做法,其他数据库平台至少在语法上可能会有一些差异
      【解决方案4】:

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

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

      【讨论】:

        猜你喜欢
        • 2021-02-27
        • 1970-01-01
        • 2015-02-26
        • 2014-01-13
        • 2014-06-17
        • 2021-04-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多