2017-08-24 3 views
0

Ich habe ein Problem beim Versuch, einen Filter auf meine Abfrage anzuwenden, nachdem Sie den Pivot-Befehl verwenden.Oracle SQL-Filter Zeilen nach Pivot

Ich verwende diesen Code:

SELECT * 
FROM (
SELECT 
ovar.object_header_id, 
c.name || '[' || oval.sequence || ']' as name, 
CASE 
    WHEN(oval.value_string IS NOT NULL) 
    THEN TO_CHAR(oval.value_string) 
    WHEN(cval.value_string IS NOT NULL) 
    THEN TO_CHAR(cval.value_string) 
    WHEN(oval.value_number IS NOT NULL) 
    THEN TO_CHAR(oval.value_number) 
    WHEN(cval.value_number IS NOT NULL) 
    THEN TO_CHAR(cval.value_number) 
    ELSE NULL 
END AS value 
FROM object_value oval 
INNER JOIN object_variant ovar 
ON ovar.id = oval.object_variant_id 
INNER JOIN characteristic c 
ON c.id = oval.characteristic_id 
LEFT JOIN characteristic_value cval 
ON oval.characteristic_value_id = cval.id 
WHERE ovar.object_type_id  = 1374 
) 
pivot (
max(VALUE) for (NAME) in ('WTI_AMBIENTE[0]','WTI_TIPO[0]','WTI_UMIDADE[0]','WTI_LINHA_DE_PRODUTO[0]','WTI_ESPACO[0]','WTI_SUBSTRATO[0]','WTI_COR[0]','WTI_ESQUEMA_TINTA[0]','WTI_UMIDADE[1]','WTI_TIPO_AGUA[0]','WTI_VELOCIDADE[0]','WTI_UMIDADE[2]') 
); 

Und damit ich bin immer eine Tabelle wie folgt aus (Spaltennamen zu groß war, so zu Zahlen geändert)

 1  2 3  4  5  6   7  8  9 
----------------------------------------------------------------------- 
1003353792 NA 00003 00008 00002 00004 Não Aplica 00001 m10 
1003353793 NA 00003 00008 00002 00004 Não Aplica 00001 m11 
1003353794 NA 00003 00008 00002 00004 Não Aplica 00001 m1 
1003353795 NA 00003 00008 00002 00004 Não Aplica 00002 m14 
1003353796 NA 00003 00008 00002 00004 Não Aplica 00002 m15 
1003353797 NA 00003 00008 00002 00004 Não Aplica 00001 m12 
1003353798 NA 00003 00008 00002 00004 Não Aplica 00002 m13 
1003353799 NA 00003 00008 00002 00004 Não Aplica 00002 m18 
1003353800 NA 00003 00008 00002 00004 Não Aplica 00001 m19 

I Now Ich muss meine neue Tabelle filtern, sagen wir nicht, dass ich nur Zeilen mit "00001" in Spalte 8 möchte, aber ich finde nicht den richtigen Code.

Ich habe versucht, dies am Ende, aber ohne Erfolg (Compiler sagte, dass „VALUE“ nicht gültig ist)

WHERE (NAME, VALUE) IN (
('WTI_UMIDADE' , '00006') 
) 

Vielen Dank für Ihre Hilfe!

+0

verwenden Gab es einen Namen ' 'WTI_UMIDADE'' in der' name' Spalte? Es ist ** nicht in der 'IN'-Liste von' PIVOT' enthalten **, also werden alle Werte, die diesem 'NAME' entsprechen, nach' PIVOT' vollständig entfernt. Oder meintest du "WTI_UMIDADE [0]" usw.? – mathguy

Antwort

0

Das Problem ist nach der Pivot Ihre Spalten neuen Namen

So sollten Sie

WHERE [WTI_UMIDADE] = '00006' 
+0

Eigentlich gibt es kein Konzept für "Ihre Spalten" und es gibt keine Spalten, die neue Namen erhalten haben. Stattdessen entfernt PIVOT einige der alten Spalten und erstellt stattdessen neue ** Spalten **. (Es gibt keine Spalte, die einen alten Namen hat und jetzt einen neuen Namen hat.) Und anstatt nach 'NAME = 'WTI_UMIDADE' und VALUE = ' zu suchen, befindet sich nun der zu überprüfende Wert in einem ** neuen ** * Spalte *, bezeichnet mit "WTI_UMIDADE [0]" '. (Übrigens, die neu erstellten Spalten sollten Standardnamen erhalten, die keine doppelten Anführungszeichen erfordern ... das ist ein Nebenproblem.) – mathguy

+0

@mathguy Zuerst sind Sie richtig, sieht aus wie ein Sprachunterschied Problem, ich dachten offensichtlich, aber ich bezog mich auch auf die neuen Spalten dort, Zweitens ist der Spaltenname verwirrend, OP benutzt drei verschiedene, ich wähle das auf dem Mitleid, aber sieht wie die neuen Spalten aus, 'WTI_UMIDADE [0]' –

+0

Dank Juan und Mathguy, habe ich Ihre beiden Antworten hinzugefügt, indem Sie in Pivot die "WTI_UMIDADE [0] als UMIDADE" und WHERE UMIDADE = '00006' verwenden. –