2016-04-13 7 views
0

Sehr neu bei Unterabfragen und finde mich in Not von Hilfe.SQL-Unterabfrage innerhalb einer SELECT-Berechnung

Ich möchte von einer einzigen Datenbank abfragen. Innerhalb dieser Abfrage möchte ich eine Variable aus zwei Variablen mit dieser Datenbank berechnen (SUBQ und TOTAL). Mein Problem ist das: Meine SUBQ-Variable muss einem zusätzlichen Satz von WHERE-Einschränkungen unterliegen, zusätzlich zu denen, die für die gesamte Abfrage verwendet werden. Vereinfachtes Beispiel-Code unten:

create table [blah] 
    as select date_part('YEAR',DATE) as Orig_Year, 
      sum([SUBQ variable])/sum(TOTAL) as UD_Rate 
     from [database] 
     where [full query requirements] 
     group by date_part('YEAR',DATE) 

Ich habe versucht, durch Angabe einer Unterabfrage in der FROM-Anweisung eine Unterabfrage innerhalb dieser Berechnung zu erstellen. Also, zum Beispiel,

   select date_part('YEAR',DATE1) as Orig_year, 
        sum(a.SUBQ)/sum(b.TOTAL) as UD_Rate 
      from database b, 
        (select SUBQ 
        from database 
        where DATE2 is not null and 
         months_between(DATE3,DATE2) <= 100 and 
         VALUE1 in ('A','B')) a 
      where VALUE2 between 50.01 and 100 
      group by date_part('YEAR',DATE1) 

Bin ich auf dem richtigen Weg mit meinem Denken hier? Ich bin noch nicht in der Nähe einer funktionalen Abfrage und habe wenig Glück gehabt, eine ähnliche Frage online zu stellen, also bin ich an dem Punkt, wo ich meine Hände hochgeworfen habe und zu dir gekommen bin. Obwohl ich wenig über sie weiß, wäre es angemessener, eine VIEW mit dem SUBQ-Wert zu erstellen und sie dann mit der breiteren Abfrage zusammenzuführen?

Gedanken von Kuchen und Kuchen für wer auch immer ist bereit, mir bei dieser Anfrage zu helfen. Vielen Dank.

+0

es würde helfen, verwenden würden, wenn Sie die Unterabfrage und vollständige Abfrageanforderungen zeigen können –

+0

Sie machen es so einfach, dass wir die Abfrage nicht erstellen können. Zeigen Sie uns das Datenbankschema, die Beispieldaten und das erwartete Ergebnis. \t Bitte lesen Sie [** How-to-Ask **] (http://stackoverflow.com/help/how-to-ask) \t \t Und hier ist ein großartiger Ort, um [** START **] (http://spaghettidba.com/2015/04/24/how-to-post-at-sql-question-on-a-public-forum/) um zu erfahren, wie Sie Ihre Fragequalität verbessern und bessere Antworten erhalten. –

+0

Fair genug. Hinzufügen ... –

Antwort

1

Ich denke, Sie wollen nur Aggregation von Bedingungen in einer Fensterfunktion. Etwas wie dieses:

select sum(case when [subquery requirements] then t.subq else 0 end)/sum(t.Total) 
from t; 

Ich bin ziemlich sicher, dass das ist, was Sie suchen. In Bezug auf Ihre create table:

select date_part('YEAR',DATE) as Orig_Year, 
     sum(case when ?? then Total else 0 end)/sum(TOTAL) as UD_Rate 
    from [database] 
    where [full query requirements] 
    group by date_part('YEAR', DATE); 

Ich vermute, dass die Spalte verglichen werden soll Total, vorbehaltlich der Bedingungen in der when.

+0

Dies ist ein guter Vorschlag, und vielleicht hatte ich es übertrieben. Ich werde es versuchen und sehen, wie es geht. Vielen Dank. –

+0

Das hat perfekt funktioniert. –

0

Verwenden Common Table-Expression dann:

-- Define the CTE expression name and column list. 
WITH subquery (Orig_year, UD_Rate) 
AS 
-- Define the CTE query. 
(
    select date_part('YEAR',DATE1) as Orig_year, 
        sum(a.SUBQ)/sum(b.TOTAL) as UD_Rate 
      from database b, 
        (select SUBQ 
        from database 
        where DATE2 is not null and 
         months_between(DATE3,DATE2) <= 100 and 
         VALUE1 in ('A','B')) a 
      where VALUE2 between 50.01 and 100 
      group by date_part('YEAR',DATE1) 
) 

Und dann subquery verwenden, wie Sie eine Tabelle in Ihrer Hauptabfrage