2016-04-12 13 views
-1

Ich habe zwei SELECT-Anweisungen und ich möchte zwei Spalten erzeugen, eine von jeder Aussage nebeneinander die beiden select-Anweisungen in einer einzigen Select-Anweisung mitmit verschiedenen WHERE-Bedingungen

Abfrage 1

SELECT DISTINCT CASE_ID 
from t1 
WHERE MODIFIED_DATE BETWEEN TO_DATE('{RUN_DATE_YYYYMMDD}','YYYYMMDD')-56 
         AND TO_DATE('{RUN_DATE_YYYYMMDD}','YYYYMMDD')-49 
 
CASE_ID 
12 
13 
14 
15 
17 

Abfrage 2

SELECT DISTINCT CASE_ID 
from t1 
WHERE MODIFIED_DATE BETWEEN TO_DATE('{RUN_DATE_YYYYMMDD}','YYYYMMDD')-49 
         AND TO_DATE('{RUN_DATE_YYYYMMDD}','YYYYMMDD')-42 
 
CASE_ID 
45 
98 
67 
90 
76 
82 
61 

sollte Endausgabe etwas wie sein:

 
C1 C2 
12 45 
13 98 
14 67 
15 90 
17 76 
    82 
    61 

Könnte mir jemand sagen, wie dies zu tun?

Vielen Dank.


aktualisiert

Einer der Abfrage, die ich aus den Antworten versucht:

SELECT DISTINCT 
      case when 
       MODIFIED_DATE BETWEEN TO_DATE('{RUN_DATE_YYYYMMDD}','YYYYMMDD') - 56 
            AND TO_DATE('{RUN_DATE_YYYYMMDD}','YYYYMMDD') - 49 
       then CASE_ID 
      end as c1, 
     DISTINCT 
       case when 
        MODIFIED_DATE BETWEEN TO_DATE('{RUN_DATE_YYYYMMDD}','YYYYMMDD')-49 
            AND TO_DATE('{RUN_DATE_YYYYMMDD}','YYYYMMDD')-42 
        then CASE_ID 
       end as c2 
from t1 
WHERE MODIFIED_DATE 
     BETWEEN TO_DATE('{RUN_DATE_YYYYMMDD}','YYYYMMDD') - 56 
      AND TO_DATE('{RUN_DATE_YYYYMMDD}','YYYYMMDD') - 42 

Und ich bin immer ORA-00936: fehlender Ausdruck. Kann mir jemand das Problem sagen?

Danke.

+2

MySQL und/oder Oracle? Nicht gekennzeichnete Produkte nicht markieren ... – jarlh

+0

Entschuldigung, in Eile eigentlich –

+1

Bearbeiten Sie Ihre Frage, wenn Sie nicht in Eile sind, und Sie werden bessere Antworten bekommen. Ihre Abfragen ergeben keinen Sinn. 'VON t1 UND [Bedingung]'? Was bedeutet das? Ich bin mir sicher, dass das letzte Bit ein Wo sein soll, aber wo ist deine Gruppe? Ohne sie können Sie nicht die Ergebnisse erhalten, von denen Sie sagen, dass Sie sie erhalten. – HoneyBadger

Antwort

1

Sie suchen eine gefilterte Aggregat:

SELECT COUNT(DISTINCT 
      case when 
       MODIFIED_DATE BETWEEN TO_DATE('{RUN_DATE_YYYYMMDD}','YYYYMMDD') - 56 
            AND TO_DATE('{RUN_DATE_YYYYMMDD}','YYYYMMDD') - 49 
       then CASE_ID 
      end) as c1, 
     COUNT(DISTINCT 
       case when 
        MODIFIED_DATE BETWEEN TO_DATE('{RUN_DATE_YYYYMMDD}','YYYYMMDD')-49 
            AND TO_DATE('{RUN_DATE_YYYYMMDD}','YYYYMMDD')-42 
        then CASE_ID 
       end) as c2 
from t1 
WHERE MODIFIED_DATE 
     BETWEEN TO_DATE('{RUN_DATE_YYYYMMDD}','YYYYMMDD') - 56 
      AND TO_DATE('{RUN_DATE_YYYYMMDD}','YYYYMMDD') - 42 

Beachten Sie, dass die jetzt WHERE Klausel beide Intervalle abdecken muss.

+0

Die COUNT-Funktion entfernt und wollte die DISTINCT CASE_ID, geben Geben ORA-00936: fehlende Ausdruck –

+0

@KetulPatani: Sie müssen Ihre Frage bearbeiten und die neue anzeigen Abfrage, wenn Sie einen Fehler haben. –

+0

Bitte überprüfen Sie die aktualisierte Frage. –

0

Wenn es keine Beziehung zwischen col1 und col2, aber Sie wollen einfach nur, indem sie Seite angezeigt Seite Sie tun können, wie folgt:

SELECT COUNT(DISTINCT CASE_ID) ,NULL 
    from t1 
    AND MODIFIED_DATE BETWEEN TO_DATE('{RUN_DATE_YYYYMMDD}','YYYYMMDD')-56 
        AND TO_DATE('{RUN_DATE_YYYYMMDD}','YYYYMMDD')-49 
union 
SELECT NULL, COUNT(DISTINCT CASE_ID) 
from t1 
AND MODIFIED_DATE BETWEEN TO_DATE('{RUN_DATE_YYYYMMDD}','YYYYMMDD')-49 
        AND TO_DATE('{RUN_DATE_YYYYMMDD}','YYYYMMDD')-42 

Der Ausgang Put etwas wie folgt aussehen woul:

C1 C2 
    12 NULL 
    13 NULL 
    . NULL 
    . NULL 
    NULL 45 
    NULL 98 
    NULL . 
    NULL . 
0

Würde dies für Sie funktionieren?

with w_q1 as (
      select case_id, row_number() over (order by modified_date) rid 
       from (
       SELECT DISTINCT CASE_ID 
        from t1 
       WHERE MODIFIED_DATE 
        BETWEEN TO_DATE('{RUN_DATE_YYYYMMDD}','YYYYMMDD') - 56 
         AND TO_DATE('{RUN_DATE_YYYYMMDD}','YYYYMMDD') - 49 
       ) 
      ), 
    w_q2 as (
      select case_id, row_number() over (order by modified_date) rid 
       from (
       SELECT DISTINCT CASE_ID 
        from t1 
       WHERE MODIFIED_DATE 
        BETWEEN TO_DATE('{RUN_DATE_YYYYMMDD}','YYYYMMDD') - 49 
         AND TO_DATE('{RUN_DATE_YYYYMMDD}','YYYYMMDD') - 42 
        ) 
      ) 
    select w_q1.case_id, w_q2.case_id 
    from w_q1 
    full outer join w_q2 
     on w_q1.rid = w_q2.rid 
/

Es dauert nur Ihre zwei „getrennte“ Ergebnisse, weist eine Art „Reihe id“ zu ihnen, und verwendet diese sich ihnen anzuschließen ... eine vollständige Außen mit join nichts, um sicherzustellen, wird abgehackt.

+0

Es funktioniert gut. Aber was, wenn ich die Spalten hier vergrößern möchte? Was ist Arbeit mit ** los **? –

+0

los ist nur der Alias. Ich verwende die analytische "row_number" -Funktion, um jedem Datensatz Zahlen zuzuordnen, die mit 1 beginnen. Das gibt mir "etwas", damit ich die Aufzeichnungen künstlich verknüpfen kann. Leider wird das Hinzufügen einer dritten Spalte sehr unhandlich, Sie würden eine neue 'w_q3'-Abfrage hinzufügen und dann die letzte Abfrage optimieren. Nicht sehr hübsch ... um ehrlich zu sein. Warum versuchst du das zu tun? Wie viele Spalten müssen Sie verarbeiten? – Ditto

+0

Ich würde bis zu 8 Spalten gehen. Ich verteile case_id nur in Bezug auf modified_date. –

Verwandte Themen