然后对Oracle sql组进行排序

时间:2013-07-31 15:59:00

标签: sql oracle

我正在尝试将我的查询结果分成两组,一组有Y标志,另一组有N标志。然后我需要根据两件事对组进行排序。

这是我尝试的查询,它不适用于GROUP BY位:

SELECT      location, 
        country 
FROM        web_loc_info 
WHERE       flag = 'Y' 
OR      flag = 'N' 
AND         available_online = 'Y' 
GROUP BY    flag 
ORDER BY    country, 
                location_desc

对此的任何帮助都会很棒,所以提前感谢任何回复

4 个答案:

答案 0 :(得分:5)

可能值得澄清的是,Oracle中的“GROUP”(来自GROUP BY操作)是将一行或多行原始数据合并到结果中的单行中的位置。

回想一下:

SELECT flag FROM web_loc_info GROUP BY flag ORDER BY flag

相当于

SELECT DISTINCT flag FROM web_log_info ORDER BY flag

(如果标志列仅包含Y和N值,则两个查询都将返回2行。)

因此,在将来,当您认为“组”询问您是否“汇总数据以便每个组值都有一行”时(在这种情况下,标志列中的“Y”/“N”值) )在这种情况下,GROUP BY子句可能就是您所追求的,或者您只想将具有相同值的排序行放在一起,在这种情况下,您只需查看ORDER BY

我说上面的Randy和Harshit非常接近我只在SELECT列表中包含FLAG列,这样你就可以看到LOCATION和COUNTRY值属于哪个“组”(并且明确了中断的位置)分组发生):

SELECT      flag,
            location, 
            country 
FROM        web_loc_info 
WHERE       flag IN ('Y', 'N')
AND         available_online = 'Y' 
ORDER BY    flag, -- DESC if you want the Y rows to show first
            location, -- DESC? or is there actually a column called LOCATION_DESC?
            country

答案 1 :(得分:3)

看起来你根本不需要这个小组。

SELECT      location, 
            country 
FROM        web_loc_info 
WHERE       flag in ( 'Y' , 'N' )
AND         available_online = 'Y' 
ORDER BY    flag desc,
            country, 
            location_desc

答案 2 :(得分:2)

可以试试这个

SELECT location, country FROM web_loc_info WHERE flag = 'Y' OR flag = 'N' AND     
available_online = 'Y'  ORDER BY FLAG,country, location_desc

答案 3 :(得分:1)

您选择的所有列都必须位于您的组中,除非您对它们进行汇总。因此,在这种情况下,您的查询将变为:

SELECT      location, 
            country 
FROM        web_loc_info 
WHERE       flag = 'Y' 
OR          flag = 'N' 
AND         available_online = 'Y' 
GROUP BY    flag,
            location, 
            country,
            location_desc
ORDER BY    country, 
            location_desc

location_desc也是必需的,因为您在order by中使用它。