聚合函数和按问题分组

时间:2010-01-04 19:12:26

标签: tsql sql-server-2000

如果我们从以下简单的SQL语句开始工作。

SELECT sor.FPARTNO, sum(sor.FUNETPRICE)
FROM sorels sor
GROUP BY sor.FPARTNO

FPartNo是零件编号,Funetprice显然是净价。用户也想要描述,这会导致问题。如果我跟进这个:

SELECT sor.FPARTNO, sor.fdesc, sum(sor.FUNETPRICE)
FROM sorels sor
GROUP BY sor.FPARTNO, sor.fdesc

如果该部件号的描述有多种变体,通常文本中的变化很小,那么我实际上并没有在部件号上进行汇总。合理?

我确信这一定很简单。如何返回与部件号对应的第一个fdesc?任何描述变化都足够,因为它们几乎完全相同。

编辑:描述是一个文本字段。

3 个答案:

答案 0 :(得分:4)

如果无法以(max)类型升级到SQL Server 2005: - )

试试这个。 SUBSTRING适用于blob,但会返回文本的varchar。所以聚合应该有效,你会丢失一些数据

SELECT
   sor.FPARTNO, MIN(SUBSTRING(sor.fdesc, 1, 8000)), sum(sor.FUNETPRICE)
FROM
    sorels sor
GROUP BY
    sor.FPARTNO, SUBSTRING(sor.fdesc, 1, 8000)

答案 1 :(得分:0)

你试过吗

SELECT sor.FPARTNO, MIN(sor.fdesc), sum(sor.FUNETPRICE) 
FROM sorels sor 
GROUP BY sor.FPARTNO

甚至 MAX 也可以。

尝试投射NTEXT字段

DECLARE @sorels TABLE(
        FPARTNO INT,
        fdesc NTEXT,
        FUNETPRICE FLOAT
)

SELECT sor.FPARTNO, MIN(CAST(sor.fdesc AS VARCHAR(4000))), sum(sor.FUNETPRICE)  
FROM @sorels sor  
GROUP BY sor.FPARTNO

答案 2 :(得分:0)

没有机会测试这个,但它应该很接近。如果您使用的是SQL Server 2005,那么使用CTE会更加清晰。

SELECT agg.FPARTNO,
       (SELECT TOP 1 inner.FDESC FROM sorels inner WHERE inner.FPARTNO = agg.FPARTNO) FDESC,
       agg.FUNETPRICESUM
FROM   (SELECT sor.FPARTNO,
               sum(sor.FUNETPRICE) FUNETPRICESUM
        FROM sorels sor 
        GROUP BY sor.FPARTNO) agg