2017-02-08 1 views
1

Ich möchte die Anzahl der Tickets pro Zahlungsmethode für jedes Ereignis verkauft werden. und ich habe die Folge Abfrage:Gruppe von funktioniert nicht korrekt Join zwei Tabellen

SELECT count(distinct(a.performance_id)) as EventQuantity, 
     sum(a.admission_count) as TicketQuantity 
FROM vw_PrecioTipoZona_Paid as a 
WHERE 1 = 1 
AND a.performance_id ='DED63133-A099-4949-AA57-13BBE9462BAF' 
GROUP BY a.performance_id 

und ich dieses Ergebnis, das OK ist:

EventQuantity TicketQuantity 
    1     203 

Aber wenn die Tabelle mit anderen verbindet, ist das Ergebnis weicht ist Summe, in diesem Fall a.admission_count wird mit der Anzahl der Datensätze in der anderen Tabelle multipliziert.

Die Abfrage, das Problem hat, ist dies:

SELECT  a.performance_id, 
      count(distinct(a.performance_id)) as EventQuantity, 
      sum(a.admission_count) as TicketQuantity, 
      b.payment_method as PaymentMethod 
FROM vw_PrecioTipoZona_Paid as a inner join vw_Payment_UserByPerformance as b 
     on a.performance_id = b.performance_id 
WHERE 
    1 = 1 
    and a.performance_id ='DED63133-A099-4949-AA57-13BBE9462BAF' 
    group by a.performance_id, b.payment_method 

Mit dieser Abfrage ich bin dieses Ergebnis zu erzielen:

EventQuantity TicketQuantity PaymentMethod 
    1    10353   Cash 
    1    5887    Card 
    1    1624   MasterCardECommerce 
    1    812   VisaEcommece 

Und das Ergebnis ist wron, sollte das Ergebnis sein:

EventQuantity TicketQuantity PaymentMethod 
     1    111    Cash 
     1    63    Card 
     1    17  MasterCardECommerce 
     1    8    VisaEcommece 

Die vw_Payment_UserByPerformance Ansicht Struktur i s die folgen:

performance_id user_role_id userrole_name userrole_group date_transaction user_id user_name owner_user_id owner_user_name amount_adm_net amount_req_net amount_charge_charge amount_total amount_net chargeTransaction tax payment_method 

Und die vw_PrecioTipoZona_Paid Ansicht Struktur der Nachfolger ist:

performance_id performance_name performance_start_date date_transaction user_role_id userrole_name userrole_group user_id user_name price_type price_zone price_zone_priority admission_count NET charge1 charge2 charge3 charge4 charge5 GROSS 

Muss ich Unterabfrage machen? Wo ist das Problem hier?

+0

Was ist das erwartete Ergebnis? Was ist der Punkt in "count (distinct (a.performance_id))", da Sie nach demselben Feld gruppieren? –

+0

Wäre hilfreich, alle Identifizierungen (Tabellen- und Spaltennamen in diesem Fall) ins Englische zu übersetzen, damit wir die Semantik Ihrer Tabelle besser verstehen. – pintxo

+0

@GiorgosBetsos Ich möchte auch die Anzahl der Tickets pro Art der Zahlung für jede Veranstaltung verkauft wissen. –

Antwort

0

Sie haben es in Ihrer Frage bereits:

ich die Anzahl der Tickets pro Zahlungsmethode verkauft zu bekommen und ich habe die Abfrage folgen

Sie sind also im Grunde suchen bei einer Abfrage wie folgt:

SELECT payment_method, COUNT(*) FROM x GROUP BY payment_method; 

Sie scheinen etwas zu anders zu machen, könnten die Ergebnisse wie gerne so, wenn Ihre Gruppe auf die payment_method Spalte auch:

SELECT  
    a.performance_id AS performanceId, 
    b.payment_method AS paymentMethod, 
    COUNT(*) numPayments 
FROM 
    vw_PrecioTipoZona_Paid as a 
INNER JOIN 
    vw_Payment_UserByPerformance AS b ON (a.performance_id = b.performance_id) 
WHERE 
    a.performance_id ='DED63133-A099-4949-AA57-13BBE9462BAF' 
GROUP BY 
    a.performance_id, 
    b.payment_method 
+0

Nicht wirklich @pintxo, ich arbeite nicht für mich. Ich möchte die Anzahl der Tickets Umsatz pro Zahlungsmethode, sollte es so etwas wie: Mastercard 3, Visa 1 –

0

Erstens, die Sinn nicht zusammen machen:

SELECT a.performance_id, 
     count(distinct(a.performance_id)) as EventQuantity, 
... 
GROUP BY a.performance_id 

Sie gruppieren das Zeug die gleichen performance_id haben, und dann fordern Sie zeigen Sie, wie viele DISTINCT performance_ids sind in der Gruppe.

Raten Sie, was die Antwort immer sein wird?

Zweitens ist SQL eine deklarative Sprache, so erklären, was Sie zuerst wollen.

Wenn Sie es in SQL nicht adäquat ausdrücken können (was in Ordnung ist) - dann tun Sie es in Worten, und bitte aktualisieren Sie Ihre Frage damit. Vermutungen über den Mangel an Inputs sind selten produktiv.

0

Mit MySQl können Sie Gruppen falsch verwenden. Sie sollten niemals die Technik verwenden, die Sie in dieser Abfrage verwendet haben.

SELECT  a.performance_id, 
      count(distinct(a.performance_id)) as EventQuantity, 
      sum(a.admission_count) as TicketQuantity, 
      b.payment_method as PaymentMethod 
FROM vw_PrecioTipoZona_Paid as a inner join vw_Payment_UserByPerformance as b 
     on a.performance_id = b.performance_id 
WHERE 
    a.performance_id ='DED63133-A099-4949-AA57-13BBE9462BAF' 
    group by a.performance_id, b.payment_method 

Wenn Sie durch die einzige Art und Weise verwenden Gruppe korrekte Ergebnisse zu gewährleisten, ist von allen nicht-aggregierte Felder zu gruppieren. Alle anderen Datenbanken machen diesen Teil der Syntax und haben daher dieses Problem nicht.

Wenn dies immer noch nicht die richtigen Ergebnisse liefert, dann gibt es ein Problem mit den Besonderheiten dessen, was Sie vice, was Sie geschrieben haben. Wir müssten die Geschäftsanforderungen, die Tabellenstruktur, die Beispieldaten in den Tabellen und die Beispielergebnisse sehen, damit Sie die richtige Abfrage finden.

Mit Blick auf Ihre zusätzlichen Details hinzugefügt, während ich dies schrieb, denke ich, dass Sie eine abgeleitete Tabelle verwenden müssen.

SELECT  a.performance_id, 
      count(a.performance_id) as EventQuantity, 
      a.admission_count as TicketQuantity, 
      b.payment_method as PaymentMethod 
FROM (select performance_id, sum(admission_count) as Admissioncount vw_PrecioTipoZona_Paid 
WHERE a.performance_id ='DED63133-A099-4949-AA57-13BBE9462BAF' 
group by performance_id)as a 
inner join vw_Payment_UserByPerformance as b 
     on a.performance_id = b.performance_id 
    group by a.performance_id, b.payment_method 
+0

Diese Abfrage gibt das gleiche Ergebnis, das ich habe. –