2017-08-24 18 views
0

我在使用pivot命令尝试将过滤器应用于查询时遇到问题。数据透视后的Oracle SQL过滤器行

我使用这个代码:

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]') 
); 

而且它我得到一台这样的(列名是太大,所以改为数字)

 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 

现在我需要过滤我的新表,不要说我只想要列8中具有“00001”的行,但我找不到正确的代码。

我尝试这样做底,但没有成功(编译器说,“VALUE”是无效的)

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

感谢您的帮助!

+0

是否有一个名字''WTI_UMIDADE''在'NAME'列?它是**不包含**在'PIVOT'的'IN'列表中,所以与'NAME'相对应的任何值都将在'PIVOT'后完全移除。或者你的意思是''WTI_UMIDADE [0]'等等? – mathguy

回答

0

的问题是透视后您的列具有新名称

所以,你应该用

WHERE [WTI_UMIDADE] = '00006' 
+0

其实没有“你的专栏”的概念,也没有专栏给出了新的名字。相反,PIVOT删除了一些旧的列,而是创建了新的**列**。 (没有列有一个旧名称,现在有一个新的名称。)而不是检查'NAME ='WTI_UMIDADE'和VALUE =​​',现在要检查的值是**新** *列*,标记为“WTI_UMIDADE [0]”。 (顺便说一句,新创建的列应该给出标准名称,不需要双引号......这是一个侧面问题。) – mathguy

+0

@mathguy首先你是正确的,看起来像是一个语言差异问题,我思想很明显,但我也指的是那里的新列,其次是列名称是混淆,OP使用三个不同的,我选择了同情,但看起来像新列名为'WTI_UMIDADE [0]' –

+0

感谢胡安和Mathguy,我加入了你的两个答案,使用“WTI_UMIDADE [0]作为UMIDADE”和WHERE UMIDADE ='00006' –

相关问题