2017-06-17 33 views
0

我有一个数据库,我需要查询来统计和计算篮球比赛中球员传球产生的积分数。例如,如果玩家传递给队友并且以2分结果,我的数据库当前将其作为一个实例存储在某个表中。如果通过结果为3分,还有另一个表格存储数据。我想查询一下,所有得到2分的球员传球实例都会被计数,然后乘以2,并且所有得到3分的球员传球实例都会被计数,然后乘以3。SQL中实例的乘以数

这里是我的相关表和SELECT语句:

CREATE TABLE Passer(
PasserID int identity PRIMARY KEY not null 
, Forename char(30) not null 
, Surname char (30) not null) 

CREATE TABLE Teammate(
TeammateID int identity PRIMARY KEY not null 
, Forename char(30) not null 
, Surname char(30) not null 
, PasserID int FOREIGN KEY REFERENCES Passer(PasserID) not null) 

CREATE TABLE TwoPointsFromShot(
    TwoPointsFromShotID int identity PRIMARY KEY not null 
    , PasserID int FOREIGN KEY REFERENCES Passer(PasserID) not null 
    , TeammateID int FOREIGN KEY REFERENCES Teammate(TeammateID) not null) 

CREATE TABLE ThreePointsFromShot(
    ThreePointsFromShotID int identity PRIMARY KEY not null 
    , PasserID int FOREIGN KEY REFERENCES Passer(PasserID) not null 
    , TeammateID int FOREIGN KEY REFERENCES Teammate(TeammateID) not null 

--First and Last Name of Passer from TwoPointsFromShot-- 
SELECT Forename, Surname 
FROM Passer 
JOIN TwoPointsFromShot ON TwoPointsFromShot.PasserID = Passer.PasserID 

--First And Last name of Passer from ThreePointsFromShot-- 
SELECT Forename, Surname 
FROM Passer 
JOIN ThreePointsFromShot ON ThreePointsFromShot.PasserID = Passer.PasserID 

当我查询从TwoPointsFromShot表PasserID,我收到一个表,看起来像:

    | PasserID 
------------------- | -------- 
       1  | 1 
       2  | 3 
       3  | 3 
       4  | 2 

我收到了类似的表当从ThreeP查询PasserID时ointsFromShot表。

     | PasserID 
--------------------- | -------- 
       1  | 3 
       2  | 1 
       3  | 3 
       4  | 4 

我想返回计数从TwoPointsFromShot的PasserID的实例的数量,并乘以通过2,计算从ThreePointsFromShot和倍数PasserID的实例数量由3,总结这两个查询值,并用播放器的名称替换PasserID。因此,它看起来像这样(如果朱利叶斯·兰德尔是PlayerID 1,达里奥·萨里奇是PlayerID 2,TJ·麦康奈尔是PlayerID 3,和布兰登英格拉姆是PlayerID 4):

| PasserName | PointsFromTwo | PointsFromThree | PassToPoints 
--- | ---------  | --------------- | ------------------ | ------------ 
    1 | Julius Randle |  2   |  3   |  5 
    2 | Dario Saric |  2   |  0   |  2 
    3 | TJ McConnell |  4   |  6   |  10 
    4 | Brandon Ingram|  0   |  3   |  3 

任何帮助将不胜感激!

回答

1

我能够通过使用两个common table expressions获得想要的结果。

--CTE to get number of 2 pointers 
WITH twoPointers AS 
(
    SELECT PasserId,COUNT(*) '2ptCount' 
    FROM TwoPointsFromShot 
    GROUP BY PasserID 
), 
--CTE to get number of 3 pointers 
threePointers As 
(
    SELECT PasserId,COUNT(*) '3ptCount' 
    FROM ThreePointsFromShot 
    GROUP BY PasserID 
) 
--Join the Passer table with 2 CTE's and 
--calculate results 
SELECT RTRIM(Forename) + ' ' + RTRIM(Surname) AS 'PasserName', 
     ISNULL(two.[2ptCount] * 2, 0.00) AS 'PointsFromTwo', 
     ISNULL(three.[3ptCount] * 3, 0.00) AS 'PointsFromThree', 
     ISNULL(two.[2ptCount] * 2, 0.00) + ISNULL(three.[3ptCount] * 3, 0.00) AS 'PassToPoints' 
FROM Passer p 
    LEFT JOIN twoPointers two ON p.PasserID = two.PasserID 
    LEFT JOIN threePointers three ON p.PasserID = three.PasserID 
+0

谢谢,@Jason。我想我需要更新我原来的问题,因为它不清楚。您制作的查询完全符合我的要求。但是,当我运行它时,它只会生成TwoPointsFromShot和ThreePointsFromShot表中标识的名称。我需要一张表格来生成两个表格中的每个人,并在可能的情况下将它们结合起来我要更新我原来的声明,以便更清楚。 – KyleF

+0

@Jason的更新: 我将联接更改为左联接,这解决了我上面概述的问题,但现在我正在为播放器没有值的列创建NULL值,该值生成NULL值在PassToPoint列中添加它们。我正在研究如何让Null值现在显示为0。 – KyleF

+0

@Jason的更新:我在最后一个SELECT语句中的所有值上使用了ISNULL函数来产生我正在寻找的答案。我将使用你的代码发布答案,我想给你信用。我只是不完全知道如何导航,所以我会发布答案,让你编辑它/把它和张贴为你自己的,我会给你投票。 – KyleF