如何从表中获取最大行数

时间:2010-04-19 00:53:20

标签: sql tsql select max

HI

我有以下代码和一个大问题:

WITH CALC1 AS (
SELECT OTQUOT, OTIT01 AS ITEMS, ROUND(OQCQ01 * OVRC01,2) AS COST
FROM @LIB@.RTQOTA WHERE OTIT01 <> ''

UNION ALL

SELECT OTQUOT, OTIT02 AS ITEMS, ROUND(OQCQ02 * OVRC02,2) AS COST
FROM @LIB@.RTQOTA WHERE OTIT02 <> ''

UNION ALL

SELECT OTQUOT, OTIT03 AS ITEMS, ROUND(OQCQ03 * OVRC03,2) AS COST
FROM @LIB@.RTQOTA WHERE OTIT03 <> ''

UNION ALL

SELECT OTQUOT, OTIT04 AS ITEMS, ROUND(OQCQ04 * OVRC04,2) AS COST
FROM @LIB@.RTQOTA WHERE OTIT04 <> ''

UNION ALL

SELECT OTQUOT, OTIT05 AS ITEMS, ROUND(OQCQ05 * OVRC05,2) AS COST
FROM @LIB@.RTQOTA WHERE OTIT05 <> ''

ORDER BY OTQUOT ASC
)

SELECT OTQUOT, ITEMS, MAX(COST)
FROM CALC1
WHERE OTQUOT = '04886471'
GROUP BY OTQUOT, ITEMS

结果:

 04886471 FEPO5050WCGA24 13.21
 04886471 GFRK1650SGL 36.21
 04886471 FRA7500GA 12.6
 04886471 CGIFESHAZ 11.02
 04886471 CGIFESHPDPR 11.79
 04886471 GFRK1350DBL 68.23
 04886471 RET1.63825GP 32.55
 04886471 FRSA 0.12
 04886471 GFRK1350SGL 55.94
 04886471 GFRK1650DBL 71.89
 04886471 FEPO6565WCGA24 16.6
 04886471 PCAP5050GA 0.28
 04886471 FEPO6565NCPAG24 0.000000

如何使用具有最高值的Itemcode获取行的结果? 在这种情况下,我需要结果:  04886471 GFRK1650DBL 71.89 但我不知道如何改变我的代码来实现这一点 - 任何人都可以帮助我吗?

2 个答案:

答案 0 :(得分:2)

使用ROW_NUMBER()窗口功能提供选择顶行的方法。请注意,您需要将其放入派生子查询中,因为WHERE子句不能引用查询自己的行号。您必须使用外部查询执行此操作:

WITH ( ...your UNION query... )
SELECT *
FROM (
  SELECT OTQUOT, ITEMS, COST, ROW_NUMBER() OVER (ORDER BY COST DESC) AS RN
  FROM CALC1
  WHERE OTQUOT = '04886471'
) T
WHERE T.RN = 1;

此外,我不会打扰你的UNION查询中的ORDER BY

答案 1 :(得分:1)

如果我正确理解您的问题,添加ORDER BY COST DESC LIMIT 1应该可以解决问题。

修改:如果评论建议您的SQL引擎不支持LIMIT,请参阅this post,了解如何使用Microsoft SQL Server模拟LIMIT(它也可以在其他符合SQL的引擎中工作,例如Oracle,PostgreSQL或DB2,因为它只使用SQL标准结构。)