【问题标题】:sorting columns with in a row SQlite用一行 SQlite 对列进行排序
【发布时间】:2020-08-22 07:20:51
【问题描述】:

我有一张这样的桌子

tbl1
    w1  w2  w3  w4   w5   w6
    4   6    2  17   29    3

我正在尝试获得这样的输出

new_C1   new_C2 new_C3    new_C4  New_C5  New_C6
 2         3    4            6      17     29

我的代码如下,但它不适用于第 3 列和第 4 列

SELECT
MIN(w1,w2,w3,w4,w5,w6) AS new_c1,
CASE MIN(w1,w2,w3,w4,w5,w6) 
                         WHEN w1 THEN MIN(w2, w3, w4,w5,w6)
                         WHEN w2 THEN MIN(w1, w3, w4,w5,w6)
                         WHEN w3 THEN MIN(w1, w2, w4,w5,w6)
                         WHEN w4 THEN MIN(w1, w2, w3,w5,w6)
                         WHEN w5 THEN MIN(w1, w2, w3,w4,w6)
                         WHEN w6 THEN MIN(w1, w2, w3,w4,w5)
                         END AS new_c2,
CASE MIN(w1,w2,w3,w4,w5,w6) 
                         WHEN w1 THEN MIN(w2, w3, w4,w5,w6)
                         WHEN w2 THEN MIN(w1, w3, w4,w5,w6)
                         WHEN w3 THEN MIN(w1, w2, w4,w5,w6)
                         WHEN w4 THEN MIN(w1, w2, w3,w5,w6)
                         WHEN w5 THEN MIN(w1, w2, w3,w4,w6)
                         WHEN w6 THEN MIN(w1, w2, w3,w4,w5)
                         END AS new_c3,

CASE MAX(w1,w2,w3,w4,w5,w6) 
                         WHEN w1 THEN MAX(w2, w3, w4,w5,w6)
                         WHEN w2 THEN MAX(w1, w3, w4,w5,w6)
                         WHEN w3 THEN MAX(w1, w2, w4,w5,w6)
                         WHEN w4 THEN MAX(w1, w2, w3,w5,w6)
                         END AS new_c5,
MAX(w1, w2, w3, w4,w5,w6) AS newC6
FROM tb1

有人可以帮我编写 SQLlite 中的代码吗?特别是对于 w3 和 w4

【问题讨论】:

  • 这不是我在 SQL 中会做的事情。您的方法还不错,但是...对于第二列,您必须知道第一列的结果,这是您必须考虑的六种可能性。对于第三列,您必须知道第 2 列的结果,因此考虑 6x6 的可能性。对于第三个,您将编写 6x6x6 行...如果您必须在 SQL 中执行此操作,我建议您使用迭代过程,即递归查询。或者使用UNION ALL 将列旋转到行,然后使用ROW_NUMBER 获取排序键,然后使用条件聚合取消旋转。如前所述:我不会用 SQL 做任何事情。
  • 也许您只需要另一个数据模型。如果您的数据库包含行而不是列中的值,则不会出现此问题。

标签: sql sql-server sqlite


【解决方案1】:

在 SQL Server 中,您可以使用横向连接(使用 cross apply 实现):

select v.*
from t cross apply
     (select max(case when seqnum = 1 then w end) as w1,
             max(case when seqnum = 2 then w end) as w2,
             max(case when seqnum = 3 then w end) as w3,
             max(case when seqnum = 4 then w end) as w4,
             max(case when seqnum = 5 then w end) as w5,
             max(case when seqnum = 6 then w end) as w6
      from (select v.w, row_number() over (order by v.w) as seqnum
            from (values (w1), (w2), (w3), (w4), (w5), (w6)) v(w)
           ) v
     ) v

SQLite 没有类似的功能。

【讨论】:

  • @forpas 。 . .阅读问题。 OP 明确指出该解决方案可以在 SQL Server 到 SQLite 中。显然,您还删除了标签。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-10-14
  • 1970-01-01
  • 2011-12-24
  • 1970-01-01
  • 2018-07-04
  • 1970-01-01
  • 2017-11-28
相关资源
最近更新 更多