记录如下:
序号 名称 金额
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 参数。
------其他解决方案--------------------
错误提示如下:
向 substring 函数传递了无效的 length 参数。
------其他解决方案--------------------
DBA_Huangzj:而且这种只能统计出A(1),B(1)这一类的数据,A,B的数据就没统计上.
------其他解决方案--------------------
谢谢,
散分,散分
------其他解决方案--------------------
--创建表以及初始化数据
IF(OBJECT_ID('TA','U') IS NOT NULL) DROP TABLE TA