日期:2014-05-17  浏览次数:20571 次

求sql如何写
记录如下:
序号 名称 金额
1   A     55
2   A(1)  55
3   B     44
4   B(2)  44

能不能用1条group语句求出如下结果

A  110
B  88

求高手赐教。
------最佳解决方案--------------------
忘了处理没有括号的那些,这个可以了
SELECT  CASE WHEN CHARINDEX('(', 名称, 1)=0 THEN 名称 ELSE SUBSTRING(名称, 1, CHARINDEX('(', 名称, 1)-1 )END  名称 ,
         SUM(金额) 金额
 FROM    TB
 GROUP BY CASE WHEN CHARINDEX('(', 名称, 1)=0 THEN 名称 ELSE SUBSTRING(名称, 1, CHARINDEX('(', 名称, 1)-1 )END 
 
 
------其他解决方案--------------------

USE tempdb;
/*
CREATE TABLE t1
(
序号 INT NOT NULL,
名称 NVARCHAR(10) NOT NULL,
金额 INT NOT NULL
);

INSERT INTO t1(序号,名称,金额) VALUES(1,'A',55),(2,'A(1)',55),(3,'B',44),(4,'B(2)',44);
*/
SELECT 
t2.Name AS 名称,
SUM(t2.金额) AS 金额合计
FROM
(
SELECT 
*,
CASE 
WHEN CHARINDEX('(',名称,1) > 0 THEN SUBSTRING(名称,1,CHARINDEX('(',名称,1)-1)
WHEN CHARINDEX('(',名称,1) = 0 THEN 名称 
END AS Name
FROM t1
) AS t2
GROUP BY t2.Name

------其他解决方案--------------------
也就是在group by 的时候忽略括号里面的内容,然后进行sum
------其他解决方案--------------------
SELECT  SUBSTRING(名称, 1) 名称 ,
         SUM(金额) 金额
 FROM    TB
 GROUP BY SUBSTRING(名称, 1)

------其他解决方案--------------------
比较严谨的方法:
SELECT  SUBSTRING(名称, 1, CHARINDEX('(', 名称, 1)-1) 名称 ,
         SUM(金额) 金额
 FROM    TB
 GROUP BY SUBSTRING(名称, 1, CHARINDEX('(', 名称, 1)-1)

------其他解决方案--------------------
好像不对吧,向 substring 函数传递了无效的 length 参数。
------其他解决方案--------------------
引用:
比较严谨的方法:SQL code?1234SELECT  SUBSTRING(名称, 1, CHARINDEX('(', 名称, 1)-1) 名称 ,         SUM(金额) 金额 FROM    TB GROUP BY SUBSTRING(名称, 1, CHARINDEX('(', 名称, 1)-1)

错误提示如下:
向 substring 函数传递了无效的 length 参数。
------其他解决方案--------------------
DBA_Huangzj:而且这种只能统计出A(1),B(1)这一类的数据,A,B的数据就没统计上.
------其他解决方案--------------------
谢谢,
散分,散分
------其他解决方案--------------------

--创建表以及初始化数据
IF(OBJECT_ID('TA','U') IS NOT NULL) DROP TABLE TA