2016-05-05 9 views
2

kann ich nicht verstehen, warum. Hilf mir bitte Ich habe Kunden-Tabelle, die viele Bestellungen hat. Also Kunde (id), Bestellung (id, customer_id). Ich möchte alle Kunden, die weniger als 100 Bestellungen haben. Also ich SQL-Abfrage zu Postgres (ich benutze Rails und Active), aber die AnfrageWenn ich PG :: UndefinedColumn habe: ERROR

SELECT customers.*, COUNT(*) AS c_c FROM "customers" LEFT OUTER JOIN orders ON orders.customer_id = customers.id GROUP BY "customers"."id" HAVING c_c < 100 OR orders.id IS NULL 

Ich habe einen Fehler

ActiveRecord::StatementInvalid: PG::UndefinedColumn: ERROR: column "c_c" does not exist 

Warum? Wie kann ich das machen?

+0

Können Sie den Rails-Code einfügen, der die Abfrage generiert hat? –

+0

Es wäre gut, wenn Sie mir Schienen-Code zur Verfügung stellen, um meine Aufgabe zu erfüllen. Ich möchte alle Kunden, die weniger als 100 Bestellungen haben. Der Kunde hat viele Bestellungen. –

Antwort

1

Die Abfrage selbst sieht nicht gültig aus. Sie können keine Alias-Spalten aus der HAVING-Klausel referenzieren. Auch Ihr COUNT (*) ist mehrdeutig. Sie können fix c_c mit COUNT(orders.id) in HAVING ersetzen, und fügen Sie COUNT(orders.id) in der SELECT:

SELECT customers.*, COUNT(orders.id) AS c_c FROM "customers" LEFT OUTER JOIN orders ON orders.customer_id = customers.id GROUP BY "customers"."id" HAVING COUNT(orders.id) < 100 OR orders.id IS NULL 

EDIT

Für eine Activerecord-Abfrage versuchen Sie dies:

Customer.joins("LEFT JOIN orders ON orders.customer_id = customers.id").group("customers.id").having("COUNT(orders.id) < 100") 

Vergewissern Sie sich, a has_many :orders definiert in Customer

+0

Ich habe es gebunden. Ich habe einen Fehler ActiveRecord :: StatementInvalid: PG :: GroupingError: FEHLER: Spalte "orders.id" muss in der GROUP BY-Klausel erscheinen oder in einer Aggregatfunktion verwendet werden –

+0

Sie sollten nicht 'orders.id' wird von a aggregiert 'COUNT' Funktion. Siehe in jedem Fall meine aktualisierte Antwort für eine Lösung in ActiveRecord. –

+0

Entschuldigung, ich sagte <100. Es bedeutet 0, 1, 2, 99 Bestellungen. Deshalb benutze ich Left Join anstelle von Inner Join. Habe ich recht? –

1

Sie können c_c nicht mit

verwenden
SELECT customers.*, (
    SELECT COUNT(*) 
    FROM orders 
    WHERE customers.id = orders.customer_id 
) AS c_c 
FROM "customers" 
LEFT OUTER JOIN orders 
ON orders.customer_id = customers.id 
GROUP BY "customers"."id" 
HAVING (SELECT COUNT(*) 
    FROM orders 
    WHERE customers.id = orders.customer_id 
) < 100 OR orders.id IS NULL 
+0

Es ist sehr große Abfrage für sehr einfache Bedienung. Ich möchte nur alle Kunden, die weniger als 100 Bestellungen haben. Bist du sicher, dass es nur ein Weg ist, es zu tun? –

Verwandte Themen