Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/81.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
组的SQL和_Sql - Fatal编程技术网

组的SQL和

组的SQL和,sql,Sql,我需要帮助获取sql中组的总和。这是我的表格: Sport NumberOfPlayers soccer 10 football 5 football 11 baseball 6 Tennis 8 这就是我希望它看起来的样子: Sport NumberOfPlayers SumOfSport soccer 10 15

我需要帮助获取sql中组的总和。这是我的表格:

Sport         NumberOfPlayers
soccer          10
football        5
football        11 
baseball        6 
Tennis          8
这就是我希望它看起来的样子:

Sport         NumberOfPlayers      SumOfSport
soccer             10                 15 
football           5                  16
football           11                 16
baseball           6                  6
Tennis             8                  8
soccer             5                  15

创建一个表格,其中包含每项运动的运动员总数,并将其命名为sumPlayer(或任何您喜欢的名称)。然后带上你的桌子,加入sumPlayer

CREATE TABLE sport(
    sport_name varchar(10),
    numberOfPlayers int
)

INSERT INTO sport (sport_name, numberOfPlayers)
VALUES ('soccer', 10),
('football', 5),
('football', 11),
('baseball', 6),
('Tennis', 8),
('soccer', 15)

SELECT sport.sport_name, sumPlayer.totalPlayer 
FROM sport LEFT JOIN (
    SELECT sport_name, SUM(numberOfPlayers) AS totalPlayer
    FROM sport
    GROUP BY sport_name ) sumPlayer ON sumPlayer.sport_name = sport.sport_name
结果如下所示:

sport_name  numberOfPlayers
soccer      10
football    5
football    11
baseball    6
Tennis      8
soccer      5

希望这有帮助,你应该结帐。一般来说,如果要使用聚合函数,如(COUNT、MAX、MIN、SUM、AVG),则应首先使用
groupby

创建一个表格,其中包含每项运动的玩家总数,并将其命名为sumPlayer(或任何您喜欢的名称)。然后带上你的桌子,加入sumPlayer

CREATE TABLE sport(
    sport_name varchar(10),
    numberOfPlayers int
)

INSERT INTO sport (sport_name, numberOfPlayers)
VALUES ('soccer', 10),
('football', 5),
('football', 11),
('baseball', 6),
('Tennis', 8),
('soccer', 15)

SELECT sport.sport_name, sumPlayer.totalPlayer 
FROM sport LEFT JOIN (
    SELECT sport_name, SUM(numberOfPlayers) AS totalPlayer
    FROM sport
    GROUP BY sport_name ) sumPlayer ON sumPlayer.sport_name = sport.sport_name
结果如下所示:

sport_name  numberOfPlayers
soccer      10
football    5
football    11
baseball    6
Tennis      8
soccer      5

希望这有帮助,你应该结帐。一般来说,如果要使用聚合函数,如(COUNT、MAX、MIN、SUM、AVG),则应首先使用
GROUP BY

使用交叉应用语句对按运动分组的运动表每行上的玩家进行聚合,如果外部应用中的运动与第一个查询中的运动相同,则使用WHERE子句过滤交叉应用的结果,以仅返回第一个查询的聚合

SELECT * FROM
(SELECT a.Sport, a.NumberOfPlayers FROM SportTable) as a

CROSS APPLY

(
SELECT Sum(b.NumberOfPlayers) as SumOfSport
FROM SportTable as b
WHERE a.Sport = b.Sport
GROUP BY b.Sport
) as b

使用CROSS APPLY语句对按sport分组的sports表的每一行上的玩家执行聚合,使用WHERE子句过滤交叉应用的结果,以仅在外部应用中的运动与第一个查询中的运动相同时返回第一个查询的聚合

SELECT * FROM
(SELECT a.Sport, a.NumberOfPlayers FROM SportTable) as a

CROSS APPLY

(
SELECT Sum(b.NumberOfPlayers) as SumOfSport
FROM SportTable as b
WHERE a.Sport = b.Sport
GROUP BY b.Sport
) as b

另一种方法是使用临时表#Temp0来创建所需的临时结构,然后使用另一个查询来更新总计:

SELECT  [Sport]
        ,[numberOfPlayers]
        ,0 [SumOfSport]
  INTO #Temp0    
  FROM Table1      

Update #Temp0 
SET [SumOfSport] =
     (
     SELECT SUM(numberOfPlayers)
     FROM #Temp0 T1
     WHERE #Temp0.Sport = T1.sport 
     group BY Sport 
     )

SELECT * from   #Temp0 
DROP Table #Temp0 
  • 请注意(正如@a_horse_和_no_name所指出的),此语法对于T-SQL(MS)是正确的。其他RDBMS可能需要一些语法调整
另一种方法是使用临时表#Temp0创建所需的临时结构,然后使用另一个查询更新总计:

SELECT  [Sport]
        ,[numberOfPlayers]
        ,0 [SumOfSport]
  INTO #Temp0    
  FROM Table1      

Update #Temp0 
SET [SumOfSport] =
     (
     SELECT SUM(numberOfPlayers)
     FROM #Temp0 T1
     WHERE #Temp0.Sport = T1.sport 
     group BY Sport 
     )

SELECT * from   #Temp0 
DROP Table #Temp0 
  • 请注意(正如@a_horse_和_no_name所指出的),此语法对于T-SQL(MS)是正确的。其他RDBMS可能需要一些语法调整
您没有指定DBMS,因此这是标准的ANSI SQL,使用窗口函数执行此操作:

select Sport, 
       NumberOfPlayers, 
       sum(NumberOfPlayers) over (partition by sport) as SumOfSport
from the_table;

您没有指定DBMS,因此这是标准的ANSI SQL,使用窗口函数执行此操作:

select Sport, 
       NumberOfPlayers, 
       sum(NumberOfPlayers) over (partition by sport) as SumOfSport
from the_table;

请展示:你已经走了多远?你尝试过什么?如果可能的话,请用你正在使用的RDBMS标记这个问题。它们之间有语法上的差异。你的查询在哪里?你使用的是哪种?博士后?甲骨文?请展示:你已经走了多远?你尝试过什么?如果可能的话,请用你正在使用的RDBMS标记这个问题。它们之间有语法上的差异。你的查询在哪里?你使用的是哪种?博士后?Oracle?您如何知道Ozzy正在使用SQL Server?您如何知道Ozzy没有使用不支持窗口功能的SQL Server 2005或2008?(排序窗口函数除外)。他没有具体说明,所以我给了他一个可以在SQL Server中使用的答案。引用
SQL
的标记信息:“用SQL标记的问题的答案应该使用ISO/IEC标准SQL”。窗口函数已经成为SQL标准的一部分将近15年了。使用标准SQL的答案将适用于几乎所有的顺便说一句:2005年SQL Server开始支持窗口功能。您如何知道Ozzy正在使用SQL Server?您如何知道Ozzy没有使用不支持窗口功能的SQL Server 2005或2008?(排序窗口函数除外)。他没有具体说明,所以我给了他一个可以在SQL Server中使用的答案。引用
SQL
的标记信息:“用SQL标记的问题的答案应该使用ISO/IEC标准SQL”。窗口函数已经成为SQL标准的一部分将近15年了。使用标准SQL的答案将适用于几乎所有的顺便说一句:2005年SQL Server开始支持窗口功能,您如何知道Ozzy正在使用SQL Server?@a_horse_,没有名字(很好的手柄)。我确实注意到你对最初问题的评论。我同意在未指定时质疑RDBMS是合法的,因为语法可以/将有所不同。然而,由于奥兹-贝尼特斯没有回应。我想我会发布一个替代答案,该答案可以在T-sql(MS)中使用,并且在概念上也是正确的,并且可以应用于其他RDBMS,只需稍加修改。谢谢你提醒我,我将编辑我的答案以使其符合条件。你怎么知道Ozzy正在使用SQL Server?@a_horse_和_no_name(漂亮的手柄)。我确实注意到你对最初问题的评论。我同意在未指定时质疑RDBMS是合法的,因为语法可以/将有所不同。然而,由于奥兹-贝尼特斯没有回应。我想我会发布一个替代答案,该答案可以在T-sql(MS)中使用,并且在概念上也是正确的,并且可以应用于其他RDBMS,只需稍加修改。谢谢你提醒我,我将编辑我的答案以使其符合条件。