ID Name Data
1 abc1 111
2 aac1 111
3 ddd2 111
4 sss1 111
5 ccc2 111
6 dds3 111
7 sdf3 111
上面有7条记录,如字段Name里的值,按最后一位来分有三类,为1的有3条记录(ID为1、2、4),为2的有2条记录(ID为3、5),为3的有2条记录(ID为6、7)。现在怎么根据这三类分组来统计求和或平均等。其中的1,2,3等关键字可能是其他的字符串,也可能在开始位置。
4 个解决方案
#1
PRINT SUBSTRING('abcd',2,1)
DECLARE @StartPosition INT, @Length INT
SET @StartPosition = 4
SET @Length = 1
SELECT 1 AS ID, 'abc1' AS Name, 111 AS Data
INTO #t
UNION ALL
SELECT 2 AS ID, 'aac1' AS Name, 111 AS Data
UNION ALL
SELECT 3 AS ID, 'ddd2' AS Name, 111 AS Data
UNION ALL
SELECT 4 AS ID, 'sss1' AS Name, 111 AS Data
UNION ALL
SELECT 5 AS ID, 'ccc2' AS Name, 111 AS Data
UNION ALL
SELECT 6 AS ID, 'dds3' AS Name, 111 AS Data
UNION ALL
SELECT 7 AS ID, 'sdf3' AS Name, 111 AS Data
SELECT * FROM #t
SELECT SUBSTRING([Name],@StartPosition, @Length) AS KeyValue, COUNT(*) AS KeyCount
FROM #t
GROUP BY SUBSTRING([Name],@StartPosition, @Length)
DROP TABLE #t
#2
不知楼主要什么样的结果。
#3
abc1 333 111
aac1 333 111
sss1 333 111
ddd2 222 111
ccc2 222 111
dds3 222 111
sdf3 222 111
这样的结果吗?
aac1 333 111
sss1 333 111
ddd2 222 111
ccc2 222 111
dds3 222 111
sdf3 222 111
这样的结果吗?
#4
IF OBJECT_ID ('dbo.Ta') IS NOT NULL
DROP TABLE dbo.Ta
Go
CREATE TABLE dbo.Ta
(ID Int,
[Name] Varchar(15) Null,
Data int
);
Insert dbo.Ta
SELECT 1 AS ID, 'abc1' AS Name, 111 AS Data
UNION ALL
SELECT 2 AS ID, 'aac1' AS Name, 111 AS Data
UNION ALL SELECT 3 AS ID, 'ddd2' AS Name, 111 AS Data
UNION ALL SELECT 4 AS ID, 'sss1' AS Name, 111 AS Data
UNION ALL SELECT 5 AS ID, 'ccc2' AS Name, 111 AS Data
UNION ALL SELECT 6 AS ID, 'dds3' AS Name, 111 AS Data
UNION ALL SELECT 7 AS ID, 'sdf3' AS Name, 111 AS Data
Select b.[Name],Sum_Qty,Avg_Qty From
(
Select LastName,Sum_Qty=Sum(data),Avg_Qty=Avg(Data) From
(
select [LastName]=right(rtrim([Name]),1),Data
From dbo.Ta
) a
Group By LastName
) a
Left join
dbo.Ta b
On a.LastName=right(rtrim(b.[Name]),1)
#1
PRINT SUBSTRING('abcd',2,1)
DECLARE @StartPosition INT, @Length INT
SET @StartPosition = 4
SET @Length = 1
SELECT 1 AS ID, 'abc1' AS Name, 111 AS Data
INTO #t
UNION ALL
SELECT 2 AS ID, 'aac1' AS Name, 111 AS Data
UNION ALL
SELECT 3 AS ID, 'ddd2' AS Name, 111 AS Data
UNION ALL
SELECT 4 AS ID, 'sss1' AS Name, 111 AS Data
UNION ALL
SELECT 5 AS ID, 'ccc2' AS Name, 111 AS Data
UNION ALL
SELECT 6 AS ID, 'dds3' AS Name, 111 AS Data
UNION ALL
SELECT 7 AS ID, 'sdf3' AS Name, 111 AS Data
SELECT * FROM #t
SELECT SUBSTRING([Name],@StartPosition, @Length) AS KeyValue, COUNT(*) AS KeyCount
FROM #t
GROUP BY SUBSTRING([Name],@StartPosition, @Length)
DROP TABLE #t
#2
不知楼主要什么样的结果。
#3
abc1 333 111
aac1 333 111
sss1 333 111
ddd2 222 111
ccc2 222 111
dds3 222 111
sdf3 222 111
这样的结果吗?
aac1 333 111
sss1 333 111
ddd2 222 111
ccc2 222 111
dds3 222 111
sdf3 222 111
这样的结果吗?
#4
IF OBJECT_ID ('dbo.Ta') IS NOT NULL
DROP TABLE dbo.Ta
Go
CREATE TABLE dbo.Ta
(ID Int,
[Name] Varchar(15) Null,
Data int
);
Insert dbo.Ta
SELECT 1 AS ID, 'abc1' AS Name, 111 AS Data
UNION ALL
SELECT 2 AS ID, 'aac1' AS Name, 111 AS Data
UNION ALL SELECT 3 AS ID, 'ddd2' AS Name, 111 AS Data
UNION ALL SELECT 4 AS ID, 'sss1' AS Name, 111 AS Data
UNION ALL SELECT 5 AS ID, 'ccc2' AS Name, 111 AS Data
UNION ALL SELECT 6 AS ID, 'dds3' AS Name, 111 AS Data
UNION ALL SELECT 7 AS ID, 'sdf3' AS Name, 111 AS Data
Select b.[Name],Sum_Qty,Avg_Qty From
(
Select LastName,Sum_Qty=Sum(data),Avg_Qty=Avg(Data) From
(
select [LastName]=right(rtrim([Name]),1),Data
From dbo.Ta
) a
Group By LastName
) a
Left join
dbo.Ta b
On a.LastName=right(rtrim(b.[Name]),1)