2017-05-01 20 views
0

Ich bin auf Oracle 12c und brauche Hilfe bei der einfachen Abfrage. HierOracle SQL Hilfe Daten Gesamt

ist die Probendaten von dem, was ich derzeit haben:

Table Name: customer 

Tabelle DDL

create table customer(
    customer_id varchar2(50), 
    name   varchar2(50), 
    activation_dt date, 
    space_occupied number(50) 
    ); 

Beispieltabellendaten:

customer_id name  activation_dt space_occupied 
abc   abc-001 2016-09-12     20 
xyz   xyz-001 2016-09-12     10 

Beispieldatenausgabe

Die Abfrage Ich suche liefert der folgende:

customer_id name  activation_dt space_occupied 
abc   abc-001 2016-09-12     20 
xyz   xyz-001 2016-09-12     10 
Total_Space null  null      30 
+0

Möchten Sie die Ausgabe der Abfrage formatieren, um eine zusätzliche Zeile hinzuzufügen, die space_cccupied aus den ersten beiden Zeilen hinzufügt (10 + 20). Wenn dies der Fall ist, versuchen Sie, es als eine Tabelle auf jedem Frontend anzuzeigen – Abhi

+0

Bitte bearbeiten Sie Ihre Frage, um Ihre besten Bemühungen bisher zu zeigen und was schief gelaufen ist. –

Antwort

0

Was Sie wollen, ist etwas ungewöhnlich, als ob customer_id ganze Zahl ist, dann muss man es auf String etc werfen, aber es ist dies Ihre Anforderung, dann, wenn sein auf diese Weise erreicht.

SELECT customer_id, 
     name, 
     activation_dt, 
     space_occupied 
FROM 
    (SELECT 1 AS seq, 
       customer_id, 
       name, 
       activation_dt, 
       space_occupied 
    FROM customer 

    UNION ALL 

    SELECT 2    AS seq, 
    'Total_Space'  AS customer_id, 
    NULL    AS name, 
    NULL    AS activation_dt, 
    sum(space_occupied) AS space_occupied 
    FROM customer 
    ) 
ORDER BY seq 

Erläuterung:

  • Inner query:
    • Erster Teil der Vereinigung aller; Ich fügte 1 as seq hinzu, um 1 zu geben, das mit Ihrem Resultset vom Kunden hartcodiert wurde.
    • Der zweite Teil der Vereinigung alle: Ich Summe nur am Berechnung (space_occupied) und hartzucodieren andere Spalten, 2 as seq
  • äußere Abfrage enthält; Wählen Sie die Daten Spalten und Reihenfolge von Seq, so Total_Space wird zuletzt zurückgegeben.

Ausgabe

+-------------+---------+---------------+----------------+ 
    | CUSTOMER_ID | NAME | ACTIVATION_DT | SPACE_OCCUPIED | 
    +-------------+---------+---------------+----------------+ 
    | abc   | abc-001 | 12-SEP-16  |    20 | 
    | xyz   | xyz-001 | 12-SEP-16  |    10 | 
    | Total_Space | null | null   |    30 | 
    +-------------+---------+---------------+----------------+ 
+0

Dank Utsav funktionierte die einzige Sache obwohl aus irgendeinem seltsamen Grund, den ich ändern musste, war, die Spalte space_occupied in eine to_number in den Daten zu werfen, die ich erhielt ihre Dezimalzahlen und Nullen, also die to_number tat den Trick –

1

Hier ist ein etwas Hack-y Ansatz dazu, ROLLUP() die Gruppierungsfunktion verwenden. Find out more.

SQL> select coalesce(customer_id, 'Total Space') as customer_id 
    2   , name 
    3  , activation_dt 
    4  , sum(space_occupied) as space_occupied 
    5 from customer 
    6 group by ROLLUP(customer_id, name, activation_dt) 
    7 having grouping(customer_id) = 1 
    8 or (grouping(name) + grouping(customer_id)+ grouping(activation_dt)) = 0; 

CUSTOMER_ID NAME   ACTIVATIO SPACE_OCCUPIED 
------------ ------------ --------- -------------- 
abc   abc-001  12-SEP-16    20 
xyz   xyz-001  12-SEP-16    10 
Total Space          30 

SQL> 

ROLLUP() erzeugt Zwischensummen für jede Kombination der Säule; Die ausführliche Klausel HAVING filtert sie heraus und behält nur die Gesamtsumme bei.

+1

+1, ich immer lerne hier etwas Neues. Lies einfach über [Rollup] (https://oracle-base.com/articles/misc/rollup-cube-grouping-functions-and-grouping-sets) und es scheint, dass es nur für diese Art von Situationen gemacht wird. Schön gelesen. – Utsav

0

Scheint wie ein großartiger Ort zu verwenden group by grouping sets scheint wie das ist, wofür sie entworfen wurden. Doc link

SELECT coalesce(Customer_Id,'Total_Space') as Customer_ID 
    , Name 
    , ActiviatioN_DT 
    , sum(Space_occupied) space_Occupied 
FROM customer 
GROUP BY GROUPING SETS ((Customer_ID, Name, Activation_DT, Space_Occupied) 
         ,()) 

Das Wichtigste hier ist, dass wir Raum summieren besetzt. Die zwei verschiedenen Gruppierungsmechanismen weisen die Engine an, jede Zeile in ihrer ursprünglichen Form und 1 Datensätze mit space_ccupied summed zu behalten; seit wir gruppieren by() leere Menge; Nur aggregierte Werte werden zurückgegeben. zusammen mit Konstanten (koaleszieren Hardcoded Wert für total!

)

enter image description here

Die Macht ist, dass wenn Sie durch andere Dinge Gruppe benötigen auch mehr Gruppierung Sätze haben könnte. Stellen Sie sich ein Material mit einer Produktdivision, einer Gruppe und einer Linie vor und ich möchte einen Bericht mit Verkaufszahlen nach Abteilung, Gruppe und Linie. Sie können einfach durch() gruppieren, um eine Gesamtsumme zu erhalten, (Produkt_Division, Produkt_Gruppe, Zeile), um eine Produktlinie (Produkt_Divsion, Produkt_Gruppe) zu erhalten, um eine Produkt_Gruppe insgesamt zu erhalten und (Produkt_Division), um eine Produkt Division Summe zu erhalten. ziemlich mächtige Sachen für eine Teilwürfelgeneration.