2010-11-02 22 views
5

Per favore, pazienza con me, questo è abbastanza difficile da spiegare e non sono sicuro se sto usando la terminologia corretta.SQL: Conditional Select within Conditional Select

Ho bisogno di fare una selezione piuttosto complicata. È effettivamente un'istruzione select che condiziona in modo condizionale quale campo utilizzare per filtrare la selezione. Se un certo campo data non è nullo, devo verificare che il valore in quel campo sia all'interno di un certo intervallo. In caso contrario, se questo campo data è nullo ho bisogno di controllare un altro campo, campo int, sullo stesso tavolo è entro un certo intervallo:

Pseudocodice:

If [Date] is not null 
    Get sum (table.value) for rows Date >= dateValue and Date < dateValue 
Else 
    Get sum (table.value) for rows Int >= intValue and Int < intValue 

Il mio attuale tentativo:

SELECT CASE WHEN a.Date IS NOT NULL THEN 
(SUM(CASE WHEN (a.Date >= cal.Date) THEN ABS(a.Value) ELSE 0 END)) 
ELSE 
(SUM(CASE WHEN (b.Days >= 0) THEN ABS(a.Value) ELSE 0 END) 
END AS 'A' 

Qualche idea? Chiedi se hai bisogno di maggiori informazioni. Grazie in anticipo.

+0

si prega di controllare la mia modifica – gbn

+0

Yup. Saluti. Avevo una dichiarazione o originariamente, ma il campo Integer sarebbe stato trascinato anche se il campo della data conteneva dati ma semplicemente non rientrava nell'intervallo. Non pensavo di aggiungere un assegno nullo lì! Ahia! – Damien

risposta

4

Un modo è di avere 2 query separate UNIONed insieme, ma solo una clausola produrrà un valore. Questo evita di avere dichiarazioni OR.

SELECT SUM(Value) 
FROM MyTable 
WHERE MyTable.Date >= dateValue and Table.Date < dateValue --NULL Date = false always 
UNION ALL 
SELECT SUM(Value) 
FROM MyTable 
WHERE MyTable.Int >= intValue and Table.Int < intValue 
    AND --ignore this clause if date is NOT NULL 
    MyTable.Date IS NULL 

Edit, con OR:

SELECT SUM(Value) 
FROM MyTable 
WHERE 
    (
     MyTable.Date IS NOT NULL AND 
     MyTable.Date >= dateValue and Table.Date < dateValue 
    ) 
     OR --actually mutually exclusive 
    (
     MyTable.Date IS NULL AND 
     MyTable.Int >= intValue and Table.Int < intValue 
    ) 
+0

Questo restituirà due somme separate, non una singola somma delle due condizioni possibili. È difficile dire che cosa stia chiedendo il poster originale, ma sembra che l'obiettivo sia solo un singolo valore. –

+0

@ Sam: perché lo farà? La clausola 1 non dà alcuna riga è DATE è NULL, quindi si applica la clausola 2. E la clausola 2 test per DATE è NULL ... se NOT NULL la clausola 1 darà le righe (se i filtri dell'intervallo sono true ovviamente). Se lo desideri, puoi aggiungere DATE IS NOT NULL alla prima clausola – gbn

+0

Sì, scusa è difficile da spiegare. Ho effettivamente delle righe di risultati, ma per ragioni che non vale la pena andare qui la riga viene identificata come all'interno di un certo intervallo sia con un campo data, sia con un campo intero, non con entrambi. Il campo data ha la priorità ma se è nullo io uso il campo intero ma una volta selezionato ottengo lo stesso valore indipendentemente da come è stato selezionato. Uff. – Damien

1

Questo funziona e non è poi così lontana dalla pseudocodice, a patto che sto interpretando ciò che si vuole fare in modo corretto.

SELECT SUM(Value) 
FROM T 
WHERE 
     CASE WHEN DateValue IS NOT NULL 
       THEN DateValue BETWEEN FromDate AND ToDate 
       ELSE IntValue BETWEEN FromInt AND ToInt 
       END