2016-11-30 3 views
1
SELECT Hotel_Name, COUNT(H_CHECK.Hotel_checkIn >= 'JUL-1-2016' AND H_CHECK.Hotel_checkIn <= 'JUL-31-2016') FROM HOTEL, H_CHECK 
GROUP BY Hotel_Name 

ORA-00907: fehlende rechte KlammerORA-00907: fehlende rechte Klammer count mit Ausdruck im Inneren

Ich habe versucht, in vielerlei Hinsicht Parenthesis setzen, aber ich konnte das nicht finden Lösung. Ich verwende Oracle Application Express 11G.

Dies ist die Abfrage:

Anzeige der Name des Hotels, die mehr als zwei Kunden auf 2016. Juli

eingecheckt hat
+1

Keine Bedingung JOIN, wie kommt das? – jarlh

Antwort

1

Sie können count auf condition in Select Anweisung von SQL-Abfrage basiert.

COUNT (
      H_CHECK.Hotel_checkIn >= 'JUL-1-2016' 
     AND H_CHECK.Hotel_checkIn <= 'JUL-31-2016') 

Das ist falsch. Sie können es gerne tun>

SELECT Hotel_Name, 
     COUNT (1)    
    FROM HOTEL 
    join H_CHECK 
    ON H_CHECK.Hotel_checkIn >= 'JUL-1-2016' 
    AND H_CHECK.Hotel_checkIn <= 'JUL-31-2016' 
GROUP BY Hotel_Name 
having count(1) > 2; 
+0

Oh ... Danke ... Dann habe ich versucht, dies nach GROUP BY Hotel_Name: HAVING COUNT (H_CHECK.Hotel_checkIn> = '30 -JUN-2016 'UND H_CHECK.Hotel_checkIn <=' 1-AUG-2016 ')> 2 Und ich bekomme ORA-00907: fehlende rechte Klammer wieder –

+0

@XING Sie können eine bedingte Anzahl absolut tun! – Boneist

+0

@NasrulArif ... Überprüfen Sie den aktualisierten Beitrag. – XING

0

Sie die CASE ... END von Ihren Bedingungen in Ihrer Zählung fehlen. Sie sind nach so etwas wie:

SELECT Hotel_Name, 
     COUNT(case when H_CHECK.Hotel_checkIn >= 'JUL-1-2016' 
         AND H_CHECK.Hotel_checkIn <= 'JUL-31-2016' 
         then 1 
      end) 
FROM HOTEL, H_CHECK 
GROUP BY Hotel_Name; 

Allerdings gibt es eine Reihe von Bedenken, die ich habe Ihre Frage zu:

  1. wenn Ihre hotel_checkin Spalte von Datentyp DATE ist, dann sollten Sie es sein zu vergleichen zu DATEs keine Zeichenfolgen. I.e. H_CHECK.Hotel_checkIn >= to_date('07-01-2016', 'mm-dd-yyyy') - Auf diese Weise vermeiden Sie die implizite Konvertierung der Zeichenfolge in ein Datum, das auf Ihrer NLS_DATE_FORMAT-Parametereinstellung beruht. Dies könnte geändert werden und dazu führen, dass die Abfrage fehlschlägt.

  2. FROM HOTEL, H_CHECK Verwenden Sie nicht die alte Verbindungsmethode; Verwenden Sie stattdessen die ANSI-Stilmethode: FROM hotel cross join h_check

  3. Haben Sie wirklich gemeint, dass die Verknüpfung ein Cross-Join sein soll, oder haben Sie vergessen, die Join-Bedingungen hinzuzufügen?

  4. Sie sollten die Spalte hotel_name als Alias ​​verwenden, um die Wartbarkeit zu unterstützen.

  5. Sie sollten Ihrer Zählspalte auch einen Namen geben.

  6. Da Sie nur Zeilen mit einem Check-in zwischen dem 1. und 31. Juli 2016 zählen, sollten Sie diese Bedingung in die where-Klausel verschieben (wie XING in ihrer Antwort gezeigt hat) * es sei denn * Sie müssen auch Hotels anzeigen innerhalb dieses Zeitraums keine Checkins haben.

  7. Ihre Bedingung setzt voraus, dass in der Spalte hotel_checkin keine Zeitelemente vorhanden sind - dh. Alles ist auf Mitternacht eingestellt. Wenn Sie jedoch ein Datum mit einer Uhrzeit haben könnten, beachten Sie, dass Ihre Zählung alle Zeilen mit einem Check-in-Datum vom 31. Juli 2016 ignoriert, die nach Mitternacht liegen. In diesem Fall Ihre obere Grenze Bedürfnisse ändern: H_CHECK.Hotel_checkIn < to_date('08-01-2016', 'mm-dd-yyyy')

+0

Wie stelle ich sicher, dass zwischen zwei Daten nur der Name des Hotels mit mehr als 2 Kunden angezeigt wird? –

+0

@NasrulArif Siehe die Antwort von Gordon Linoff - Sie müssen dann nur noch eine having-Klausel in die Zeile 'count (hc.hotel_id)> 2' einfügen. – Boneist

+0

Ich sehe, dass funktioniert wirklich gut, genau wie ich brauche ... Danke –

1

Sobald Sie Ihre sofortige Syntax Problem zu beheben, Sie die richtige JOIN Syntax benötigen.

Eine Möglichkeit, das Problem zu beheben ist einfach, die Bedingungen zu einer WHERE Klausel zu bewegen, in einer Abfrage wie folgt resultierende:

SELECT Hotel_Name, COUNT(hc.hotel_id) 
FROM HOTEL h LEFT JOIN 
    H_CHECK hc 
    ON h.hotel_id = hc.hotel_id -- I don't know what the right join condition is 
WHERE hc.Hotel_checkIn >= DATE '2016-07-01' AND 
     hc.Hotel_checkIn <= DATE '2016-07-31' 
GROUP BY Hotel_Name; 
Verwandte Themen