特殊表排序

时间:2014-11-13 09:14:52

标签: sql sql-server-2008 sorting

我有一个来自上一个查询的两列TABLE,如下所示:

+--------+--------+
| Id_no1 | Id_no2 |
+--------+--------+
|  1     |    2   |
|  1     |    2   |
|  1     |    3   |
|  1     |    5   |
|  2     |    1   |
|  2     |    3   |
|  2     |    3   |
|  2     |    5   |
|  3     |    1   |
|  3     |    2   |
+--------+--------+

TABLE是ORDER BY Id_no1,Id_no2

我希望Id_no1和Id_no2像这样配对:

+--------+--------+
| Id_no1 | Id_no2 |
+--------+--------+
|  1     |    2   |
|  1     |    2   |
|  2     |    1   |
|        |        |
|  1     |    3   |
|  3     |    1   |
|        |        |
|  1     |    5   |
|        |        |
|  2     |    3   |
|  2     |    3   |
|  3     |    2   |
|        |        |
|  2     |    5   |
+--------+--------+

Id_no1和Id_no2是商店,发件人和收件人。我想在所有商店之间进行集体交流。

2 个答案:

答案 0 :(得分:3)

可能会有所帮助:

select * from mytab 
order by case when id_no1 < id_no2 then id_no1 else id_no2 end, 
         case when id_no2 > id_no1 then id_no2 else id_no1 end;

=以分钟为单位(col1,col2),max(col1,col2)

答案 1 :(得分:0)

您的要求显然按照相关方的顺序对您的数据进行排序。要做到这一点,你试图先由最低的参与方(升序)排序,然后由最高的参与方(也是升序)排序。

为了完成这项工作,我写了以下内容:这会按照您显示的顺序给出一个输出,并且可以正常工作......假设我的猜测与您的问题有很大关联。

/* Sample Data */

    WITH Table1 AS 
      (
        SELECT ID_No1, ID_No2
        FROM 
          ( VALUES 
            (1,2),
            (1,2),
            (1,3),
            (1,5),
            (2,1),
            (2,3),
            (2,3),
            (2,5),
            (3,1),
            (3,2)
          ) AS VALUE(ID_No1, ID_No2)
      )
/* Query */
    SELECT ID_No1, ID_No2
    FROM 
      (
        SELECT 
            *,
            CASE WHEN ID_No1 > ID_No2 THEN ID_No1 ELSE ID_No2 END AS MaxParty,
            CASE WHEN ID_No1 < ID_No2 THEN ID_No1 ELSE ID_No2 END AS MinParty
        FROM Table1
      ) arr
    ORDER BY MinParty, MaxParty, ID_No1