SQL查询交错两种不同的状态

时间:2014-11-05 07:05:34

标签: sql

我有一个包含字段

的表格测试表
Id    Name       Status
1     John       active
2     adam       active
3     cristy    incative
4     benjamin  inactive
5     mathew    active
6     thomas    inactive
7     james     active

我想要一个应该显示重新填充的查询

Id    Name       Status

1     John       active
3     cristy    incative
2     adam       active
4     benjamin  inactive
5     mathew    active
6     thomas    inactive
7     james     active

我的问题是如何以活动状态的顺序记录,然后处于非活动状态,然后处于活动状态,然后处于非活动状态等。就像来自此表的那样。

3 个答案:

答案 0 :(得分:2)

最后我得到了答案

SET @rank=0;
SET @rank1=0;
SELECT @rank:=@rank+1 AS rank,id,name,status FROM `testtablejohn` where status='E'
UNION
SELECT @rank1:=@rank1+1 AS rank,id,name,status FROM `testtablejohn` where status='D'
order by rank

答案 1 :(得分:1)

此查询对交错的活动/非活动状态进行排序:

SELECT [id], 
       [name], 
       [status] 
FROM   (
           (
             SELECT
                Row_number() OVER(ORDER BY id) AS RowNo, 
                0 AS sorter, 
                [id], 
                [name], 
                [status] 
             FROM   testtable 
             WHERE  [status] = 'active'
           ) 
           UNION ALL 
           (
             SELECT
                Row_number() OVER(ORDER BY id) AS RowNo, 
                1 AS sorter, 
                [id], 
                [name], 
                [status] 
             FROM   testtable 
             WHERE  [status] = 'inactive'
           )
       ) innerUnion 
ORDER  BY ( RowNo * 2 + sorter ) 

此方法在两个SELECT语句上使用内部UNION,一个返回活动行,另一个返回非活动行。它们都生成了RowNumber,稍后再乘以2以确保它始终均匀。有一个分拣机列只是一个字段,并确保一个唯一的数字可用于排序:将它添加到RowNumber产生一个奇数或偶数,取决于活动/非活动状态,因此允许结果要交错。

SQL Fiddle链接在这里,允许测试和操作: http://sqlfiddle.com/#!3/8a8a1/11/0

在没有指定的数据库系统的情况下,我假设正在使用SQL Server 2008(或更新版本)。其他DBMS上需要备用行编号系统。

答案 2 :(得分:0)

由于你没有发布任何你到目前为止尝试过的例子,我也会限制我对一般方法的回答。

一种方法可能是为active行生成行号,为inactive行生成行号。从active开始编号为1并且仅使用奇数(这意味着每次将计数器增加2)并对inactive行使用2和偶数进行相同的操作。将这两个计数器放在同一列中。

您将最终使用单个列轻松地在ORDER BY子句中进行排序。

以下是一些可能对您有用的链接:
MySQL - Get row number on select
http://www.mysqltutorial.org/mysql-case-statement/

请试一试。如果你不能使它工作,那么告诉我们你到目前为止尝试了什么。在问题中发布一些示例代码,我们可以为您提供指导!