2016-09-24 3 views
1

Ich habe eine Tabelle mit der folgenden Struktur.Cant herauszufinden, Self Join Abfrage

+-----------------------+--------------+------+-----+---------+-------+ 
| Field     | Type   | Null | Key | Default | Extra | 
+-----------------------+--------------+------+-----+---------+-------+ 
| linq_order_num  | char(32)  | NO | PRI | NULL |  | 
| order_status_id  | int(11)  | YES | MUL | NULL |  | 
| order_id    | varchar(100) | YES |  | NULL |  | 
| item_name    | varchar(120) | YES |  | NULL |  | 
| item_cost    | float  | YES |  | NULL |  | 
| custmer_id   | int(11)  | YES | MUL | NULL |  | 
| order_date_time  | datetime  | YES |  | NULL |  | 
| order_category  | varchar(120) | YES |  | NULL |  | 
| ordered_by   | int(11)  | YES | MUL | NULL |  | 
| linq_shipping_cost | float  | YES |  | NULL |  | 
| website_shipping_cost | float  | YES |  | NULL |  | 
| total_cost   | float  | YES |  | NULL |  | 
| advance_amount  | float  | YES |  | NULL |  | 
| website    | varchar(120) | YES |  | NULL |  | 
| other     | varchar(120) | YES |  | NULL |  | 
| rvn     | int(11)  | YES |  | NULL |  | 
| received_date   | datetime  | YES |  | NULL |  | 
| delivered_date  | datetime  | YES |  | NULL |  | 
| store_id    | int(11)  | YES | MUL | NULL |  | 
+-----------------------+--------------+------+-----+---------+-------+ 

Also für jeden Tag muss ich die Gesamtauftragskosten finden. Ich kann es mit dieser Abfrage erhalten.

select sum(total_cost), date_format(order_date_time,"%Y-%m-%d") from 
     order_item group by date_format(order_date_time,"%Y-%m-%d") 

Auch ich brauche den gesamten Restbetrag bezahlt zu den gelieferten Daten.

select sum(total_cost-advance_amount),date_format(delivered_date,"%Y-%m-%d") 
     from order_item group by date_format(delivered_date,"%Y-%m-%d") 

Nicht alle Tage, Aufträge geschehen und nicht alle Tage Lieferungen happen.If es keine Aufträge sollten die Gesamtkosten für diesen Tag als Null und die Gesamt gezeigt verbleibende Betrag sein sollte gezeigt Tag Summe von (total_cost-advance_amount) für den Tag.

Gibt es eine Möglichkeit, die beiden obigen Abfragen in einer Abfrage zu kombinieren und das Ergebnis zu erhalten?

So für einen bestimmten Tag d zusammenfassen: Ich brauche Summe (total_cost), wo ordered_date_time d =, I Summe benötigen (total_cost -advance_amount), wo DELIVERED_DATE = d Wesentlichen für eine Tabelle wie folgt aussehen:

Date   Total Cost   Total Delivery Amounts 
d     500      2000 
d1    0      900 
d2    900      0 

Ich habe versucht, eine Unterabfrage zu verwenden. Das Problem ist es nicht, die Fälle für d1 anzuzeigen, wo die Gesamtkosten für diesen Tag 0 ist

Abfrage:

select 
    date_format(order_date_time,"%Y-%m-%d") date, 
    sum(total_cost) total, 
    sum(advance_amount) advance_amount, 
    IFNULL((select sum(total_cost-advance_amount) 
from order_item a 
where date_format(a.delivered_date,"%Y-%m-%d") = date_format(d.order_date_time,"%Y-%m-%d")),0) delivery_amount 
from order_item d 
group by date_format(order_date_time,"%Y-%m-%d"), delivery_amount 
+2

Verwenden Sie in der Zukunft nicht 'describe', um Ihr Tabellenschema zu dokumentieren. Verwenden Sie 'show create table order_item'. Beschreiben ist praktisch nutzlos für jeden zu verwenden – Drew

Antwort

1

Sie können Ihre zwei Abfragen als abgeleitete Tabellen verwenden und kommen sie auf Datum . Das Problem ist, dass Sie einen FULL OUTER JOIN benötigen, der von MySQL nicht unterstützt wird. Sie müssen also zuerst alle Termine aus beiden Spalten

select date(order_date_time) as d from order_item 
union 
select date(delivered_date) as d from order_item 

und links verwenden extrahieren kommen mit Ihren Fragen

select 
    dates.dt, 
    coalesce(tc.total_cost, 0), 
    coalesce(tm.total_remaining, 0) 
from (
    select date(order_date_time) as dt from order_item 
    union 
    select date(delivered_date) as dt from order_item 
) dates 
left join (
    select sum(total_cost) as total_cost, date(order_date_time) as dt 
    from order_item 
    group by dt 
) tc using(dt) 
left join (
    select sum(total_cost-advance_amount) as total_remaining, date(delivered_date) 
    from order_item 
    group by dt 
) tm using(dt) 

ich auch date_format(..) mit date(..) ersetzt. Sie können die Daten in der äußeren Auswahl oder in Ihrer Anwendung formatieren.