2014-12-13 110 views
1

我想弄清楚如何做一些更高级的SQL功能(至少对我来说是先进的)。SQL总结和平均查询与

我想借以下数据:

  • 只有从第1轮使用的数据和2
  • 总结分,每名
  • 显示总和数据轮1和2为每个不同的名称

这是我做一个简单的例子的数据表:

Table: tblPoints 

ID NAME ROUND POINTS 
--------------------------- 
1 Dummy 1  30 
2 Yes  1  45 
3 Hi  1  20 
4 Dummy 2  45 
5 Yes  2  15 
6 Hi  2  65 
7 Newbie 2  10 
8 Dummy 3  150 
9 Yes  3  120 
10 Hi  3  145 

这是我想看到什么(通知再次它只是轮1和2):

NAME SUM_POINTS_EVERYONE SUM_POINTS COUNT_NAMES 
------------------------------------------------------ 
Dummy  230    75   4 
Yes   230    60   4 
Hi   230    85   4 
Newbie  230    10   4 

我开始使用此只选择我要查房,并得到新的列2:

SELECT name, 
     (SELECT SUM(points) FROM tblPoints WHERE round IN (1, 2)) AS sum_points_everyone, 
     (SELECT COUNT(DISTINCT name) FROM tblPoints WHERE ROUND IN (1, 2)) AS count_names 
FROM tblPoints 
WHERE round IN (1, 2); 

自定义行的公式如下:

萨姆指向 =总结了玩家对轮1和2的名称的点(在这种情况下)

琛指出大家 =总结了所有的唯一名称


由于从轮1和2每个人点(在这种情况下)

伯爵的名字 =的COUNT()你可以看到,我可以得到SUM_POINTS_EVERYONE和COUNT_NAMES行,但是我在这里如何获得其他的结果。我如何只输出不同名称的行与上述字段?

注意:如果这超出了SQL的范围,我可以用PHP手动执行它 - 但我试图查看是否可以在一个查询中完成,因此我不必将工作转移到PHP。


如果有人想迅速做出表,这里的转储:

CREATE DATABASE IF NOT EXISTS `testdb`; 
USE `testdb`; 
CREATE TABLE `tblPoints` (
    `id` int(10) unsigned NOT NULL AUTO_INCREMENT, 
    `name` varchar(45) NOT NULL, 
    `round` int(10) unsigned NOT NULL, 
    `points` int(10) unsigned NOT NULL, 
    PRIMARY KEY (`id`) 
) ENGINE=InnoDB AUTO_INCREMENT=11 DEFAULT CHARSET=latin1; 
INSERT INTO `tblPoints` VALUES (1,'Dummy',1,30),(2,'Yes',1,45),(3,'Hi',1,20),(4,'Dummy',2,45),(5,'Yes',2,15),(6,'Hi',2,65),(7,'Newbie',2,10),(8,'Dummy',3,50),(9,'Yes',3,20),(10,'Hi',3,45); 

回答

1
SELECT NAME, 
(SELECT SUM(POINTS) FROM tblPoints WHERE ROUND IN (1,2)) AS SUM_POINTS_EVERYONE, 
SUM(POINTS) AS SUM_POINTS, 
COUNT(1) AS COUNT_NAMES 
FROM tblPoints 
WHERE ROUND IN (1,2) 
GROUP BY NAME 

输出

| NAME | SUM_POINTS_EVERYONE | SUM_POINTS | COUNT_NAMES | 
|--------|---------------------|------------|-------------| 
| Dummy |     230 |   75 |   2 | 
|  Hi |     230 |   85 |   2 | 
| Newbie |     230 |   10 |   1 | 
| Yes |     230 |   60 |   2 | 

Fiddle

编辑的名字算

SELECT NAME, 
(SELECT SUM(POINTS) FROM tblPoints WHERE ROUND IN (1,2)) AS SUM_POINTS_EVERYONE, 
SUM(POINTS) AS SUM_POINTS, 
(SELECT COUNT(DISTINCT NAME) FROM tblPoints WHERE ROUND IN (1,2)) AS COUNT_NAMES 
FROM tblPoints 
WHERE ROUND IN (1,2) 
GROUP BY NAME 

输出

| NAME | SUM_POINTS_EVERYONE | SUM_POINTS | COUNT_NAMES | 
|--------|---------------------|------------|-------------| 
| Dummy |     230 |   75 |   4 | 
|  Hi |     230 |   85 |   4 | 
| Newbie |     230 |   10 |   4 | 
| Yes |     230 |   60 |   4 | 

Fiddle

+0

完美的作品。谢谢! – Water 2014-12-13 17:41:31