递增 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
我有一个如下所示的查询:
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