2017-06-17 4 views
0

Ich habe eine Datenbank, die ich abfragen muss, um die Anzahl der Punkte zu zählen und zu summieren, die durch einen Pass eines Spielers in einem Basketballspiel generiert werden. Zum Beispiel, wenn ein Spieler zu einem Teamkollegen übergeht und dieser Pass 2 Punkte ergibt, speichert meine Datenbank das momentan als 1 Instanz in einer bestimmten Tabelle. Es gibt eine andere Tabelle, in der die Daten gespeichert werden, wenn der Durchlauf 3 Punkte ergibt. Ich möchte abfragen, dass alle Instanzen eines Passes von einem Spieler, der 2 Punkte ergibt, gezählt und dann mit 2 multipliziert werden, und alle Instanzen eines Passes von einem Spieler, der 3 Punkte ergibt, werden gezählt und dann mit 3 multipliziert.Multiplizieren der Anzahl der Instanzen in SQL

Hier sind meine entsprechenden Tabellen und select-Anweisungen:

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 

Als ich die PasserID aus der TwoPointsFromShot Tabelle abfragen, erhalte ich eine Tabelle, die wie folgt aussieht:

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

I Tabelle erhalten eine ähnliche wenn PasserID von ThreeP abgefragt wird ointsFromShot-Tabelle.

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

Ich möchte eine Abfrage zurückzugeben, die die Anzahl der Instanzen des PasserID von TwoPointsFromShot zählt und multipliziert das mit 2, zählt die Anzahl der Instanzen des PasserID von ThreePointsFromShot und Multiples, dass von 3, fasst die beiden Werte und ersetzt die PasserID durch den Namen des Players. So ist es so aussehen würde (wenn Julius Randle PlayerID 1, Dario Saric ist PlayerID 2, ist TJ McConnell PlayerID 3 und Brandon Ingram ist 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 

Jede Hilfe wäre sehr dankbar!

Antwort

1

Ich konnte die gewünschten Ergebnisse mit zwei common table expressions erhalten.

--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

Danke, @Jason. Ich denke, ich muss meine ursprüngliche Frage aktualisieren, da es nicht klar war. Die Abfrage, die du erzeugt hast, macht genau das, was ich gefragt habe. Wenn ich es ausführe, erzeugt es nur die Namen, die in der Tabelle TwoPointsFromShot und ThreePointsFromShot identifiziert werden. Ich brauche einen Tisch, der aus beiden Tabellen alle zusammenstellt und diese nach Möglichkeit kombiniert. Ich werde meine ursprüngliche Aussage aktualisieren, um klarer zu sein. – KyleF

+0

UPDATE für @Jason: Ich habe die Joins in LINKE JOINS geändert, was das oben beschriebene Problem behoben hat, aber jetzt erstelle ich NULL-Werte in den Spalten, für die ein Player keinen Wert hat, der NULL-Werte erzeugt in den PassToPoint-Spalten, wenn sie hinzugefügt werden. Ich untersuche Möglichkeiten, Null-Werte jetzt als 0 anzuzeigen. – KyleF

+0

UPDATE für @Jason: Ich habe die ISNULL-Funktion für alle Werte in der letzten SELECT-Anweisung verwendet, um die Antwort zu erzeugen, nach der ich suche. Ich werde die Antwort mit Ihrem Code posten, und ich möchte Ihnen Anerkennung geben. Ich bin mir nicht ganz sicher, wie ich das ansteuern soll, also werde ich die Antwort posten und sie bearbeiten lassen/nehmen und als eigenen Beitrag posten, und ich gebe dir die Stimme. – KyleF

Verwandte Themen