2016-06-10 48 views
0

我有一個表像這樣的Oracle SQL:加入相同的表,獲取所需的輸出

FILEID | FILENAME    | STATUS 
100  |Employee_06102016.txt |PASS 
100  |Employee_06092016.txt |FAIL 
100  |Employee_06092016.txt |MISS 
101  |ABC_06092016.txt  |PASS 

我讀從文件的文件名,並傳遞給SQL。比方說,我只有文件名'Emplyee_06102016.txt'這是與PASS staus。有了這個,我需要加入同一個表,並採取具有相同文件ID的PASS和FAIL文件名的計數,並且應該排除MISS狀態。

我想這樣下面的東西,但計數爲3包括所有。我應該只得到2

SELECT COUNT (T.FILEID) FROM TABLE_NAME T, TABLE_NAME S 
WHERE T.FILEID=S.FILEID 
AND T.FILENAME = 'Employee_06102016.txt' AND T.STATUS IN ('PASS', 'FAIL'); 
+2

爲什麼你需要重新加入相同的表? –

+0

我需要計算具有相同fileid的PASS&FAIL狀態。我只有一個記錄的文件名。所以我應該加入合適嗎? – Karthik

+0

'Select FileName,count(t.status) from Table_name t 其中t.fileName ='Employee_06102016.txt'和Status <>'FAIL'Group by FileName'您失敗的原因是因爲(如果您需要自加入)你只需要包含('PASS','FAIL')的s.status。否則你得到一個加入失敗記錄,導致你得到3記錄,而不是2. – xQbert

回答

1

甲骨文設置

CREATE TABLE table_name (FILEID, FILENAME, STATUS) AS 
SELECT 100, 'Employee_06102016.txt', 'PASS' FROM DUAL UNION ALL 
SELECT 100, 'Employee_06092016.txt', 'FAIL' FROM DUAL UNION ALL 
SELECT 100, 'Employee_06092016.txt', 'MISS' FROM DUAL UNION ALL 
SELECT 101, 'ABC_06092016.txt',  'PASS' FROM DUAL; 

查詢

SELECT * 
FROM (
    SELECT t.*, 
     COUNT(1) OVER (PARTITION BY FileID) AS num_pass_fail 
    FROM table_name t 
    WHERE status IN ('PASS', 'FAIL') 
) 
WHERE filename = 'Employee_06102016.txt'; 

輸出

FILEID FILENAME    STATUS NUM_PASS_FAIL 
---------- --------------------- ------ ------------- 
     100 Employee_06102016.txt PASS    2 
+0

它的工作原理和我正在尋找的... :)非常感謝... – Karthik

0
SELECT 
    FILENAME, 
    SUM(CASE status WHEN 'PASS' THEN 1 ELSE 0 END) as "Pass Count", 
    SUM(CASE status WHEN 'FAIL' THEN 1 ELSE 0 END) as "Fail Count", 
    SUM(CASE status WHEN 'MISS' THEN 1 ELSE 0 END) as "Miss Count" 
FROM 
    TableName 
WHERE 
    FILENAME = 'Employee_06102016.txt' 
+0

謝謝..我試過這個,它只給出passcount爲1和其他2爲零..因爲文件名不同。我的要求是,我有文件名。我需要檢查所有文件名,它們具有相同的fileid(本例中爲100),並檢查有多少記錄。對於我來說,預期的輸出計數是2 ..(我拿Employee_06102016.txt並得到100作爲文件ID。在100個文件ID下,有一個合格和一個失敗) – Karthik

0

看來你只需要:

SELECT COUNT (1) 
FROM TABLE_NAME 
WHERE FILENAME = 'Employee_06102016.txt' 
    AND STATUS IN ('PASS', 'FAIL'); 
+0

返回一個計數1 - OP期望計數爲2 (因爲有2行具有相同的'FileID')。 – MT0

0

試試這個

select cnt from ( 
    select count(*) as cnt, 
     listagg(filename, ',') within group(order by filename) as filename_list from table_name 
    where status in ('PASS', 'FAIL') group by fileid 
) where instr(filename_list, 'Employee_06102016.txt')>0; 
+0

如果您有一個名爲「Not_Employee_06102016.txt」的文件,會發生什麼? – MT0