Tsql 聚合函数与分组问题
如果我们从下面的简单SQL语句开始,它是有效的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
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,否则你会得到伪组吗?