递增 ORDER BY 语句

incrementing an ORDER BY statement

我有一个如下所示的查询:

SELECT ElapsedTime, COUNT(SurgeryID) as numberOfOps
FROM Table
WHERE Doctor = 'Dr. ABC'
AND numberOfOps > 5
GROUP BY ElapsedTime
ORDER BY CASE
  WHEN ElapsedTime = 'Preoperative' THEN 1
  WHEN ElapsedTime = '2 Weeks' THEN 2
  WHEN ElapsedTime = '6 Weeks' THEN 3
  WHEN ElapsedTime = '3 Months' THEN 4
  WHEN ElapsedTime = '6 Months' THEN 5
  WHEN ElapsedTime = '1 Year' THEN 6
  WHEN ElapsedTime = '2 Years' THEN 7
  WHEN ElapsedTime = '3 Years' THEN 8
  WHEN ElapsedTime = '4 Years' THEN 9
  WHEN ElapsedTime = '5 Years' THEN 10
  WHEN ElapsedTime = '6 Years' THEN 11
  WHEN ElapsedTime = '7 Years' THEN 12
  WHEN ElapsedTime = '8 Years' THEN 13
  WHEN ElapsedTime = '9 Years' THEN 14
  WHEN ElapsedTime = '10 Years' THEN 15
  ELSE ElapsedTime END ASC

如果 ABC 博士没有任何结果 w/ 'DaysElapsed' == 'Preoperative',ORDER BY 的其余部分将被忽略 - 如以下结果所示:

'5 Years,6 Years,7 Years,8 Years,10 Years,2 Weeks,6 Weeks,3 Months,6 Months,1 Year,2 Years,3 Years,4 Years,Unknown'

如何使这个 ORDER BY 子句更健壮?

有什么方法可以在语句中包含递增变量,例如

SELECT ElapsedTime, COUNT(SurgeryID) as numberOfOps
FROM Table
WHERE Doctor = 'Dr. ABC'
GROUP BY Time
var i = 0;
ORDER BY CASE
  WHEN ElapsedTime = 'Preoperative' THEN ++i
  WHEN ElapsedTime = '2 Weeks' THEN ++i
  WHEN ElapsedTime = '6 Weeks' THEN ++i
  WHEN ElapsedTime = '3 Months' THEN ++i
  .          .          .          .
  .          .          .          .
  .          .          .          .
  .          .          .          .   
  WHEN ElapsedTime = '10 Years' THEN ++1
  ELSE ElapsedTime END ASC

我知道 SQL 不允许这样的事情,但这是我正在寻求的功能类型。

谢谢

您或许可以编写一个将 DaysElapsed varchars 转换为数字的 PLSQL 函数,然后像这样使用它:

SELECT Time
  FROM Table
 WHERE Doctor = 'Dr. ABC'
 GROUP BY Time
 ORDER DaysElapsedToOrderBy(DaysElapsed);

函数本身可能如下所示。 注意这是非常基本的,可能会导致错误 - 仅将其作为示例实现以供进一步改进。

CREATE FUNCTION DaysElapsedToOrderBy(psDaysElapsed VARCHAR) RETURN NUMBER IS

    nCount        NUMBER;
    sIntervalType VARCHAR(100);

BEGIN

    -- Split DaysElapsed to number of intervals and intervalType
    nCount := TO_NUMBER(SUBSTR(psDaysElapsed, 1, 1));
    sIntervalType := SUBSTR(psDaysElapsed, 3);

    -- calculate order by value
    CASE sIntervalType

        WHEN 'days'   THEN RETURN nCount
        WHEN 'months' THEN RETURN nCount * 10
        WHEN 'years'  THEN RETURN nCount * 100
        ...

    END

END;

您可以使用游标(它将为您提供 I++ 逻辑)来填充 CTE/Temp Table/Table 变量,然后将其加入 table,并根据查询,您可以按未选择的列排序。回家后的长篇回答。

创建引用 table,例如:

CREATE TABLE ElapsedTimeRef (
    varchar timeString,
    int orderValue
);

INSERT INTO ElapsedTimeRef (timeString, orderValue) VALUES
    ('Preoperative', 1),
    ('2 Weeks', 2),
    . . . . .
    ('9 Years', 14),
    ('10 Years', 15);

然后在你的 SELECT 中加入它,例如:

SELECT ElapsedTime, COUNT(SurgeryID) as numberOfOps
FROM foo, ElapsedTimeRef etr
WHERE foo.Doctor = 'Dr. ABC'
AND foo.numberOfOps > 5
AND foo.ElapsedTime = etr.timeString
GROUP BY foo.ElapsedTime
ORDER BY etr.orderValue ASC

(P.S。我假设你的 table 名称实际上不是 "Table",因为 TABLE 是一个 SQL 关键字。)

试试下面的查询

SELECT ElapsedTime, SURGERY_COUNT   from (select case ElapsedTime WHEN 'Preoperative' THEN 1 
                        WHEN '2 Weeks'       THEN 2
                        WHEN '2 Years'       THEN 3 
                        WHEN '10 Years' THEN 4
                        ELSE 0 END AS  surgery_order , ElapsedTime, COUNT(SurgeryID) as SURGERY_COUNT from test_table 
where Doctor = 'Dr. ABC' and numberOfOps > 5 GROUP BY surgery_order, ElapsedTime order by surgery_order asc) as DATA_TABLE