Tsql 聚合函数与分组问题

Tsql 聚合函数与分组问题,tsql,sql-server-2000,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.fd

如果我们从下面的简单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?任何描述变体都足够了,因为它们几乎完全相同

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

你试过了吗

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
你试过了吗

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

我们还没有机会测试这个,但应该很接近。如果您使用的是SQLServer2005,那么使用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

我们还没有机会测试这个,但应该很接近。如果您使用的是SQLServer2005,那么使用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

如果无法升级到SQL Server 2005的(最大)类型:-)

试试这个。用于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)

如果无法升级到SQL Server 2005的(最大)类型:-)

试试这个。用于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)

我尝试了Max,而刚才尝试了Min,并收到以下错误:错误SQL Server数据库错误:文本、ntext和图像数据类型在此子查询或聚合表达式中无效。sor.fdesc的类型是什么?sor.fdesc是一个文本字段,如我在上一次编辑中所述。:)我尝试了Max,而刚才尝试了Min,并收到以下错误:错误SQL Server数据库错误:文本、ntext和图像数据类型在此子查询或聚合表达式中无效。sor.fdesc的类型是什么?sor.fdesc是一个文本字段,如我在上一次编辑中所述。:)Inner是一个保留字,我相信。Inner是一个保留字,我相信。你不是还必须使用MIN或MAX,否则你会得到伪组吗?你不是还必须使用MIN或MAX,否则你会得到伪组吗?