2016-12-05 2 views
1

Ich habe mit Datenbanken auf Zugriff gearbeitet, aber zum ersten Mal muss ich MS SQL Server 2012 verwenden, daher muss ich meine Abfragen schreiben, da ich den Abfrage-Generator nicht so benutzerfreundlich finden Zugriff.Sql linken Join plus CASE Abfrage

Das Problem, auf dem ich feststecke, ist keine sehr anspruchsvolle. Ich habe 2 Tabellen wie folgt:

  • dbo.WF_PM_ACCT_DET_DB with columns to use Account, Postal_Code, Client_Birth_Date
  • dbo.WF_PM_SUM_DB with columns to use Account, Total_Avg_AuA

Was ich will ist eine Abfrage mit Ergebnissen zu tun haben, die nach Postleitzahlen Gruppen, zählt die Anzahl der Client in den jeweiligen Post Code, auch Gruppen nach Alter, wo AuA ist> 0

Also zuerst muss ich Client in 3 Gruppen nach Alter gruppieren (< 35,35-55 und> 55). Zählen Sie dann, wie viele Clients sich in einer bestimmten Altersgruppe in einer bestimmten Postleitzahl befinden. Wählen Sie außerdem nur Clients mit einer Summe (AuA)> 0 aus der zweiten Tabelle aus. der Ausgang wäre so etwas wie dies

Postal code CountofClient Age_group 
1m1 2m2   50   <35 
1m1 2m2   20   35-50 
and so on... 

sieht so weit das ist, was ich habe:

SELECT  Postal_Code, COUNT(Account) AS Count_Account, Age,     
AVG(YEAR(GETDATE()) - YEAR(client_birth_date)) AS 'Age' 

CASE WHEN AGE <=35      THEN 'AGEGROUPA' 
     WHEN AGE >35 AND AGE <55   THEN 'AGEGROUPB' 
     WHEN AGE >=55      THEN 'AGEGROUPC' 
end as 'clientageseg' 

FROM   dbo.WF_PM_ACCT_DET_DB 
GROUP BY Postal_Code, Client_Birth_Date, Age 

jede mögliche Hilfe geschätzt wird. Vielen Dank.

Antwort

1
;WITH cte AS (
    SELECT 
     postal_code 
     ,Account 
     ,CASE 
      WHEN 
      (DATEADD(year,DATEDIFF(year, [DOB] ,GETDATE()) , [DOB]) > GETDATE()) 
      THEN DATEDIFF(year, [DOB] ,GETDATE()) -1 
      ELSE DATEDIFF(year, [DOB] ,GETDATE()) 
     END as Age 
    ,SUM(s.AuA) OVER (PARTITION BY a.Account) as AuASum 
    FROM 
     dbo.WF_PM_ACCT_DET_DB a 
     INNER JOIN dbo.WF_PM_SUM_DB s 
    ON a.Account = s.Account 
) 

SELECT 
    postal_code 
    ,COUNT(Account) as Count_Account 
    ,CASE 
     WHEN Age <= 35 THEN 'AGEGROUPA' 
     WHEN Age > 35 AND Age < 55 THEN 'AGEGROUPB' 
     WHEN Age >= 55 THEN 'AGEGROUPC' 
    END as ClientAgeSeg 
FROM 
    cte 
WHERE 
    AuASum > 0 
GROUP BY 
    postal_code 
    ,CASE 
      WHEN Age <= 35 THEN 'AGEGROUPA' 
      WHEN Age > 35 AND Age < 55 THEN 'AGEGROUPB' 
      WHEN Age >= 55 THEN 'AGEGROUPC' 
    END 

Willkommen bei SQL Server von Acess! Am Ende wirst du es lieben, so viel mehr kannst du tun. Wenn beginnign einige der schönen Funktionen zu graben sind Gemeinsame Tabellenausdrücke [CTE] und Window-Funktionen. Ich verwende ein CTE im obigen Beispiel. Sie müssen nicht, aber es wird Ihr Leben ein wenig einfacher machen, wenn Sie zum Datum Vergleich kommen.

Hinweis bei der Berechnung von AGE müssen Sie feststellen, ob das Geburtsdatum bereits im Jahr aufgetreten ist oder noch kommen wird.

+0

Das ist großartig, aber ich muss nur Konten zählen ist Summe (AuA) von der anderen Tabelle (dbo.WF_PM_SUM_DB) ist> 0. Also meine Frage ist wirklich: wo gebe ich die linke Join ?? –

+0

@DataGuy Sie würden es in der CTE eingeben. Ich war nicht sicher, Ihren Beitrag zu lesen, wie das ins Spiel kommen würde. Ich aktualisiert mit 1 Lösung durch Hinzufügen der JOIN und verwenden Sie eine Fensterfunktion.Sie könnten auch eine korrelierte Unterabfrage in der where-Klausel verwenden .. – Matt

+0

Danke.Ich schaue Youtube-Videos auf Fensterfunktionen und CTE.Weitere andere Vorschläge? –

0

Versuchen Sie folgendes:

SELECT DISTINCT Postal_Code, 
     COUNT(Account)OVER (PARTITION BY Postal_Code) AS Count_Account, 
     Age,     
     AVG(YEAR(GETDATE()) - YEAR(client_birth_date)) AS 'Age', 
     CASE WHEN AGE <=35      THEN 'AGEGROUPA' 
      WHEN AGE >35 AND AGE <55   THEN 'AGEGROUPB' 
      WHEN AGE >=55      THEN 'AGEGROUPC' 
     END as 'clientageseg' 
FROM dbo.WF_PM_ACCT_DET_DB A 
LEFT JOIN dbo.WF_PM_SUM S ON A.Account=S.AccountNumber 
WHERE S.AccountNumber IS NOT NULL 
+0

Danke. Was ist mit der Einbeziehung der Teil, wo ich will, dass Konten nur zählen, wenn Summe (AuA) von der anderen Tabelle ist> 0 –

+0

@Masood Ich habe dich nicht bekommen. Kannst du es näher erklären? Wenn es etwas anderes ist, als in der Frage erwähnt, posten Sie eine andere Frage und teilen Sie den Link. –

+0

Es tut mir leid, dass ich das nicht gut geschrieben habe. Das Problem ist, dass es eine andere Tabelle dbo.WF_PM_SUM gibt, die eine Spalte AuA und eine Kontonummer hat (diese Kontonummer ist ein Link zwischen den beiden Tabellen. Wenn wir die Konten im obigen Code per Postleitzahl zählen, wie kann ich das sicherstellen? nur die accounts, bei denen AuA> 0 war, wurden gezählt? –

0

Sie könnten versuchen, einen CTE Gruppe unter Verwendung der Daten zuerst und dann den Fall gelten:

;WITH CTE AS 
(
    SELECT   
     Postal_Code, 
     COUNT(Account) AS Count_Account,     
     AVG(YEAR(GETDATE()) - YEAR(client_birth_date)) AS 'Age' 
    FROM 
     dbo.WF_PM_ACCT_DET_DB 
    GROUP BY Postal_Code 
) 
SELECT 
    Postal_Code, 
    Count_Account, 
    CASE 
    WHEN AGE <= 35    THEN 'AGEGROUPA' 
    WHEN AGE > 35 AND AGE < 55 THEN 'AGEGROUPB' 
    WHEN AGE >= 55    THEN 'AGEGROUPC' 
    END AS 'clientageseg' 
FROM CTE 
+0

Dies ist eine großartige Antwort! Danke –