2016-05-06 12 views
0

Ich habe eine Abfrage mit Daten, die auf monatlicher Basis hinzugefügt wird, aber es gibt mir die mehrdeutige SQL-Fehler und ich weiß nicht, was zu tun ist. Ich habe überall recherchiert und kann die Antwort auf mein Problem nicht finden, also hier geht es!Mehrdeutige Spalte bei der Auswahl bestimmter Monat Daten

dies ist die Abfrage:

SELECT  REF.TOS        AS [TOS Value] 
     ,RSA_BELFAST_1921.Percentage   AS [Belfast] 
     ,RSA_BIRMINGHAM_1941$.Percentage  AS [Birmingham] 
     ,RSA_CARDIFFREGUS_2911$.Percentage  AS [Cardiff Regus] 
     ,RSA_CASTLEMEAD_1941$.Percentage  AS [Castlemead] 
     ,RSA_CHELMSFORD_1941$.Percentage  AS [Chelmsford] 
     ,RSA_EDNBGH_2951$.Percentage   AS [Edimburgh] 
     ,RSA_EUROPE_IOM_DOUG_2911$.Percentage AS [Europe] 
     ,RSA_GLASGOW_7301$.Percentage   AS [Glasgow] 
     ,RSA_GUERNSEY_ICICI_1921P$.Percentage AS [Guernsey] 
     ,RSA_HALIFAX_7301$.Percentage   AS [Halifax] 
     ,RSA_HORSHAM_1002$.Percentage   AS [Horsham] 
     ,RSA_IPSWICH_1921$.Percentage   AS [Ipswich] 
     ,RSA_LEEDS_2911$.Percentage    AS [Leeds] 
     ,RSA_LEICESTER_2951$.Percentage   AS [Leicester] 
     ,RSA_LIVERPOOL_1002$.Percentage   AS [Liverpool] 
     ,RSA_MANCHESTER_1941$.Percentage  AS [Manchester] 
     ,RSA_ONELONDON_1002.Percentage   AS [London] 
     ,RSA_PETERBOROUGH_3825.Percentage  AS [Peterborough] 
     ,RSA_REDHILL_2951.Percentage   AS [Redhill] 
     ,RSA_SUNDERLAND_1941$.Percentage  AS [Sunderland] 


FROM (SELECT TOS FROM RSA_BELFAST_1921   UNION 
     SELECT TOS FROM RSA_BIRMINGHAM_1941$  UNION 
     SELECT TOS FROM RSA_CARDIFFREGUS_2911$  UNION 
     SELECT TOS FROM RSA_CASTLEMEAD_1941$  UNION 
     SELECT TOS FROM RSA_CHELMSFORD_1941$  UNION 
     SELECT TOS FROM RSA_EDNBGH_2951$   UNION 
     SELECT TOS FROM RSA_EUROPE_IOM_DOUG_2911$ UNION 
     SELECT TOS FROM RSA_GLASGOW_7301$   UNION 
     SELECT TOS FROM RSA_GUERNSEY_ICICI_1921P$ UNION 
     SELECT TOS FROM RSA_HALIFAX_7301$   UNION 
     SELECT TOS FROM RSA_HORSHAM_1002$   UNION 
     SELECT TOS FROM RSA_IPSWICH_1921$   UNION 
     SELECT TOS FROM RSA_LEEDS_2911$   UNION 
     SELECT TOS FROM RSA_LEICESTER_2951$  UNION 
     SELECT TOS FROM RSA_LIVERPOOL_1002$  UNION 
     SELECT TOS FROM RSA_MANCHESTER_1941$  UNION 
     SELECT TOS FROM RSA_ONELONDON_1002   UNION 
     SELECT TOS FROM RSA_PETERBOROUGH_3825  UNION 
     SELECT TOS FROM RSA_REDHILL_2951   UNION 
     SELECT TOS FROM RSA_SUNDERLAND_1941$ 
     ) AS REF 

FULL OUTER JOIN RSA_BELFAST_1921   ON REF.TOS = RSA_BELFAST_1921.TOS 
FULL OUTER JOIN RSA_BIRMINGHAM_1941$  ON REF.TOS = RSA_BIRMINGHAM_1941$.TOS 
FULL OUTER JOIN RSA_CARDIFFREGUS_2911$  ON REF.TOS = RSA_CARDIFFREGUS_2911$.TOS 
FULL OUTER JOIN RSA_CASTLEMEAD_1941$  ON REF.TOS = RSA_CASTLEMEAD_1941$.TOS 
FULL OUTER JOIN RSA_CHELMSFORD_1941$  ON REF.TOS = RSA_CHELMSFORD_1941$.TOS 
FULL OUTER JOIN RSA_EDNBGH_2951$   ON REF.TOS = RSA_EDNBGH_2951$.TOS 
FULL OUTER JOIN RSA_EUROPE_IOM_DOUG_2911$ ON REF.TOS = RSA_EUROPE_IOM_DOUG_2911$.TOS 
FULL OUTER JOIN RSA_GLASGOW_7301$   ON REF.TOS = RSA_GLASGOW_7301$.TOS 
FULL OUTER JOIN RSA_GUERNSEY_ICICI_1921P$ ON REF.TOS = RSA_GUERNSEY_ICICI_1921P$.TOS 
FULL OUTER JOIN RSA_HALIFAX_7301$   ON REF.TOS = RSA_HALIFAX_7301$.TOS 
FULL OUTER JOIN RSA_HORSHAM_1002$   ON REF.TOS = RSA_HORSHAM_1002$.TOS 
FULL OUTER JOIN RSA_IPSWICH_1921$   ON REF.TOS = RSA_IPSWICH_1921$.TOS 
FULL OUTER JOIN RSA_LEEDS_2911$    ON REF.TOS = RSA_LEEDS_2911$.TOS 
FULL OUTER JOIN RSA_LEICESTER_2951$   ON REF.TOS = RSA_LEICESTER_2951$.TOS 
FULL OUTER JOIN RSA_LIVERPOOL_1002$   ON REF.TOS = RSA_LIVERPOOL_1002$.TOS 
FULL OUTER JOIN RSA_MANCHESTER_1941$  ON REF.TOS = RSA_MANCHESTER_1941$.TOS 
FULL OUTER JOIN RSA_ONELONDON_1002   ON REF.TOS = RSA_ONELONDON_1002.TOS 
FULL OUTER JOIN RSA_PETERBOROUGH_3825  ON REF.TOS = RSA_PETERBOROUGH_3825.TOS 
FULL OUTER JOIN RSA_REDHILL_2951   ON REF.TOS = RSA_REDHILL_2951.TOS 
FULL OUTER JOIN RSA_SUNDERLAND_1941$  ON REF.TOS = RSA_SUNDERLAND_1941$.TOS 

WHERE REF.TOS = 'ef (DSCP 46)' and [Report Date] = 'April 2016' 
ORDER BY [TOS Value] 

wir tun dies im letzten Monat begonnen und wir hatten nur 1 Monat im Wert von Daten, so dass die Abfrage das erwartete Ergebnis in Ordnung und produziert lief das war:

TOS Value  Belfast Birmingham Report Date 
ef (DSCP 46) 0.14%  1.91%   March 2016 

aber jetzt, da wir die April-Daten hinzugefügt haben, erhalten wir den mehrdeutigen Fehler!

bitte helfen! Was stimmt mit meiner Anfrage nicht? Auch .... jetzt, dass ich den zweiten Monat von Daten hinzugefügt habe, wenn ich die Abfrage ohne den monatlichen "WHERE" -Parameter ausführen, produziert die Abfrage wie 52k Zeilen von Daten, wenn es nur 1 Zeile sein sollte!

+0

Von welcher Tabelle kommt Ihr [Report Date]? – Shaneis

+0

Report_date kommt von welcher Tabelle .....? – Chanukya

+0

@Shaneis Alle Tabellen haben eine Spalte namens Berichtsdaten. –

Antwort

4

Vermutlich müssen Sie in allen Joins [Report Date] einschließen. Andernfalls erhalten Sie kartesische Produkte und die Ergebnisse werden nicht korrekt sein.

Sobald Sie dies tun, müssen Sie Logik wie:

COALESCE(t1.[Report Date], t2.[Report Date], . . .) = 'April 2016' 

Ich werde ein paar Anmerkungen machen:

  • sollten Sie Tabelle Aliase verwenden, um die Abfrage einfacher ist, zu schreiben und zu lesen.
  • Datumsangaben sollten in einem ISO-Standardformat wie YYYY-MM gespeichert werden.
  • Noch wichtiger: Die Datenstruktur sieht viel zu kompliziert aus. Es sieht so aus, als ob sich ähnliche Daten für verschiedene Städte in verschiedenen Tabellen befinden. Das ist nicht die relationale Art, Datenbanken zu entwerfen.
  • Die umfangreiche Verwendung von full outer join schlägt auch ein Problem mit der zugrunde liegenden Datenstruktur vor.
+0

Ich stimme all Ihren Punkten zu wie sie vollkommen Sinn machen ... es ist nur, dass sie bei der Arbeit diese Aufgabe mir zugewiesen haben und ich bin ein Anfänger mit SQL und musste etwas schaffen, das funktionierte, ohne auch nur an Design und Format zu denken. Ich weiß, dass Ihre Antwort funktioniert, da Ihr Ruf Sie vorstellt, aber immer noch nicht weiß, wo Sie die Abfrage ändern müssen, damit sie funktioniert. jede Änderung können Sie mir zeigen, wie die Abfrage sollte bitte aussehen, wie ich eine 3-Stunden-Frist zu erfüllen haben? Danke im Voraus! –

+0

Sie müssen [Report Date] zu Ref für den Join hinzufügen, daher glaube ich nicht, dass Sie COALESCE benötigen. Ich würde versuchen und helfen, aber OP möchte, dass wir für ihn kodieren. – Paparazzi

+0

@Paparazzi Ich würde wirklich sehr dankbar sein, wenn Sie mir helfen könnten, wie ich eine Wand geschlagen habe und ich nicht weiß, wie man das Problem repariert, obwohl Gordon Lunoff antws der richtige ist, aber ich weiß einfach nicht, wie man seine Vorschläge in die Abfrage setzt . –

Verwandte Themen