22,295
社区成员
发帖
与我相关
我的任务
分享
--> 测试数据:[ta]
IF OBJECT_ID('[ta]') IS NOT NULL DROP TABLE [ta]
GO
CREATE TABLE [ta]([name] VARCHAR(3),[a] INT,[b] INT,[c] INT,[d] INT)
INSERT [ta]
SELECT '001',1,2,3,4 UNION ALL
SELECT '001',5,6,7,4 UNION ALL
SELECT '001',2,3,4,8 UNION ALL
SELECT '002',1,2,3,4 UNION ALL
SELECT '002',3,2,2,5 UNION ALL
SELECT '003',2,2,2,4
--------------开始查询--------------------------
SELECT [name], AVG([a] * 1.0), AVG([b] * 1.0), AVG([c] * 1.0),
SUM(CASE WHEN [d]<=4 THEN 1 ELSE 0 END) * 100.0 / COUNT([name])
FROM [ta]
GROUP BY [name]
UNION ALL
SELECT '统计', AVG([a] * 1.0), AVG([b] * 1.0), AVG([c] * 1.0),
SUM(CASE WHEN [d]<=4 THEN 1 ELSE 0 END) * 100.0 / COUNT([name])
FROM [ta]
----------------结果----------------------------
/*
name
---- --------------------------------------- --------------------------------------- --------------------------------------- ---------------------------------------
001 2.666666 3.666666 4.666666 66.666666666666
002 2.000000 2.000000 2.500000 50.000000000000
003 2.000000 2.000000 2.000000 100.000000000000
统计 2.333333 2.833333 3.500000 66.666666666666
(4 行受影响)
*/
IF EXISTS (SELECT 1 FROM SYSOBJECTS WHERE name = 'a')
BEGIN
DROP TABLE A
END
GO
CREATE TABLE a
(
name VARCHAR(10),
a INT,
b INT,
c INT,
d INT
)
GO
INSERT INTO a
SELECT '001', 1, 2, 3, 4 UNION
SELECT '001', 5, 6, 7, 4 UNION
SELECT '001', 2, 3, 4, 8 UNION
SELECT '002', 1, 2, 3, 4 UNION
SELECT '002', 3, 2, 2, 5 UNION
SELECT '003', 2, 2, 2, 4
GO
WITH t AS
(SELECT name,SUM(a) / CAST(COUNT(1) AS DECIMAL(10,2)) AS avga,SUM(b) / CAST(COUNT(1) AS DECIMAL(10,2)) AS avgb,SUM(c) / CAST(COUNT(1) AS DECIMAL(10,2)) AS avgc,SUM(CASE WHEN d <= 4 THEN 1 ELSE 0 END) AS small4,SUM(CASE WHEN d > 4 THEN 1 ELSE 0 END) AS big4
FROM a
GROUP BY name),
m AS
(
SELECT name,avga,avgb,avgc,RTRIM(small4 * 100 / (small4 + big4)) + '%' as small4,RTRIM(big4 * 100 / (small4 + big4)) + '%' as big4
FROM t
)
SELECT * FROM m
UNION
SELECT '总计',avg(t.avga),avg(T.avgb),avg(T.avgc),RTRIM(SUM(t.small4) * 100 / (SUM(t.small4) + SUM(t.big4))) + '%' as small4,RTRIM(SUM(t.big4) * 100 / (SUM(t.small4) + SUM(t.big4))) + '%' as big4
FROM t
name avga avgb avgc small4 big4
001 2.66666666666 3.66666666666 4.66666666666 66% 33%
002 2.00000000000 2.00000000000 2.50000000000 50% 50%
003 2.00000000000 2.00000000000 2.00000000000 100% 0%
总计 2.22222222222 2.55555555555 3.05555555555 66% 33%
--> 测试数据:[ta]
IF OBJECT_ID('[ta]') IS NOT NULL DROP TABLE [ta]
GO
CREATE TABLE [ta]([name] VARCHAR(3),[a] INT,[b] INT,[c] INT,[d] INT)
INSERT [ta]
SELECT '001',1,2,3,4 UNION ALL
SELECT '001',5,6,7,4 UNION ALL
SELECT '001',2,3,4,8 UNION ALL
SELECT '002',1,2,3,4 UNION ALL
SELECT '002',3,2,2,5 UNION ALL
SELECT '003',2,2,2,4
--------------开始查询--------------------------
SELECT [name], AVG([a] * 1.0), AVG([b] * 1.0), AVG([c] * 1.0),
SUM(CASE WHEN [d]<=4 THEN 1 ELSE 0 END) * 100.0 / COUNT([name])
FROM [ta]
GROUP BY [name]
UNION ALL
SELECT '统计', AVG([a] * 1.0), AVG([b] * 1.0), AVG([c] * 1.0),
SUM(CASE WHEN [d]<=4 THEN 1 ELSE 0 END) * 100.0 / COUNT([name])
FROM [ta]
----------------结果----------------------------
/*
name
---- --------------------------------------- --------------------------------------- --------------------------------------- ---------------------------------------
001 2.666666 3.666666 4.666666 66.666666666666
002 2.000000 2.000000 2.500000 50.000000000000
003 2.000000 2.000000 2.000000 100.000000000000
统计 2.333333 2.833333 3.500000 66.666666666666
(4 行受影响)
*/
--> 测试数据:[ta]
IF OBJECT_ID('[ta]') IS NOT NULL DROP TABLE [ta]
GO
CREATE TABLE [ta]([name] VARCHAR(3),[a] INT,[b] INT,[c] INT,[d] INT)
INSERT [ta]
SELECT '001',1,2,3,4 UNION ALL
SELECT '001',5,6,7,4 UNION ALL
SELECT '001',2,3,4,8 UNION ALL
SELECT '002',1,2,3,4 UNION ALL
SELECT '002',3,2,2,5 UNION ALL
SELECT '003',2,2,2,4
--------------开始查询--------------------------
SELECT [name], AVG([a] * 1.0), AVG([b] * 1.0), AVG([c] * 1.0),
SUM(CASE WHEN [d]<=4 THEN 1 ELSE 0 END) * 100.0 / COUNT([name])
FROM [ta]
GROUP BY [name]
WITH ROLLUP
----------------结果----------------------------
/*
name
---- --------------------------------------- --------------------------------------- --------------------------------------- ---------------------------------------
001 2.666666 3.666666 4.666666 66.666666666666
002 2.000000 2.000000 2.500000 50.000000000000
003 2.000000 2.000000 2.000000 100.000000000000
NULL 2.333333 2.833333 3.500000 66.666666666666
(4 行受影响)
*/
SELECT NAME
,AVG(A) AS A
,AVG(B) AS B
,AVG(C) AS C
,SUM(CASE WHEN D<=4 THEN 1 ELSE 0 END)*100.0/SUM(1) AS [<=4]
,SUM(CASE WHEN >4 THEN 1 ELSE 0 END)*100.0/SUM(1) AS [>4]
FROM A
GROUP BY NAME
UNION ALL
SELECT
NAME = '总计'
,AVG(A) AS A
,AVG(B) AS B
,AVG(C) AS C
,SUM(CASE WHEN D<=4 THEN 1 ELSE 0 END)*100.0/SUM(1) AS [<=4]
,SUM(CASE WHEN >4 THEN 1 ELSE 0 END)*100.0/SUM(1) AS [>4]
FROM A