2014-11-21 101 views
0

下面的查询返回我需要的信息;两列是身份号码,第二列是总号码。SQL - 返回两个匹配值

SELECT T.number as 'Number',T.total as 'highest service level' 
FROM(
    SELECT PARTNER_WORKORDER.statusNo as number, count(statusNo) as total 
    FROM PARTNER_WORKORDER 
    inner join PARTNER_WORKORDER_ADDRESS 
    ON PARTNER_WORKORDER.salesOrderNo = PARTNER_WORKORDER_ADDRESS.salesorder_no 
    WHERE orderDt <= '2012-11-20 00:00:00.000' AND country_code <> 'US' 
    group by PARTNER_WORKORDER.statusNo 
) 
AS T 

我现在需要做的是返回JUST最高的总数和匹配它的状态数字。我知道MAX会给我最高的总数,但我不知道如何获得与总数相匹配的状态数字。我想我需要使用CASE,但是我从来没有过这方面的经验。

任何帮助将不胜感激。

+0

你只是想要返回一条记录吗?或者想为每个“数字”的最大记录? – paqogomez 2014-11-21 17:10:42

+1

什么是您的DBMS? – 2014-11-21 17:10:43

回答

4

只需使用order bylimittopfetch first 1 row only。例如:

SELECT PARTNER_WORKORDER.statusNo as number, count(statusNo) as total 
FROM PARTNER_WORKORDER inner join 
    PARTNER_WORKORDER_ADDRESS 
    ON PARTNER_WORKORDER.salesOrderNo = PARTNER_WORKORDER_ADDRESS.salesorder_no 
WHERE orderDt <= '2012-11-20 00:00:00.000' AND country_code <> 'US' 
group by PARTNER_WORKORDER.statusNo 
ORDER BY total desc 
LIMIT 1 

请注意,您不需要子查询。 SQL标准将是fetch first 1 rows only而不是limit 1,但并不是很多数据库都支持(还)。

+0

我将它更改为SELECT TOP PARTNER _....作为选择行,现在它完美地工作。不知道这是因为我使用的是否是Microsoft SQLServer,但您的回复使我得到了正确的答案。非常感谢。 – enigmahfc 2014-11-21 17:25:38

+0

是的,那是因为您正在使用SQL Server。 SQL Server,Sybase,Teradata和MS Access使用'TOP'; Postgres和MySQL使用'LIMIT'; Oracle使用'rownum'; DB2,Oracle和SQL Server使用“只提取第一行”。后者是标准的,但只有最新版本的Oracle和SQL Server支持它。 – 2014-11-21 22:43:58