2014-10-16 101 views
1

我有一個包含許多列的表,我計算列上的具體名稱,如果該名稱不在列表中,我想將其顯示爲零,但不能獲取列出。ORACLE顯示計數爲零,當列爲空時爲空

SELECT Names, COUNT (*) 
FROM NAMESTABLE 
WHERE names IN 
       ('Jenny', 
       'Penny', 
       'George', 
       'James', 
       'Jessica', 
       'Monica', 
       'Erica') 
      AND 
adeddate BETWEEN '2014/10/15' AND '2014/10/16' 
GROUP BY names 

NAMES || COUNT(*) 
Jenny || 33 
Penny || 4 
George || 25 
James || 87 

,所以我想傑西卡,莫妮卡,埃裏卡爲零連這些名字都沒有列

Names || Count(*) 
Jenny || 33 
Penny ||  4 
George || 25 
James || 87 
Jessica ||  0 
Monica ||  0 
Erica ||  0 

nvl(count(*),0)不起作用

+0

那麼namestable是否具有jessica monica和erica的值?如果沒有,你是說你想讓你的過濾器在結果集中添加數值,當他們不在那裏時?這不僅僅是SQL的工作原理。你必須首先有一個表格/設置這個數據。這可以通過union,cte或temp表來完成。 – xQbert 2014-10-16 12:56:40

回答

2

你可以組你的結果按名稱,然後left join結果以你的名字填寫表格:

SELECT rn.name, NVL(cnt, 0) 
FROM  (SELECT 'Jenny' AS name FROM dual 
      UNION ALL 
      SELECT 'Penny' FROM dual 
      UNION ALL 
      SELECT 'George' FROM dual 
      UNION ALL 
      SELECT 'James' FROM dual 
      UNION ALL 
      SELECT 'Jessica' FROM dual 
      UNION ALL 
      SELECT 'Monica' FROM dual 
      UNION ALL 
      SELECT 'Erica' FROM dual) rn 
LEFT JOIN (SELECT name, COUNT(*) AS cnt 
      FROM  namestable 
      WHERE adeddate BETWEEN '2014/10/15' AND '2014/10/16' 
      GROUP BY name) n ON n.name = rn.name 
+0

它的工作原理。非常感謝。 – Arno 2014-10-16 14:22:21

0

則必須使用其他的語法:

SELECT t.Names, COUNT(n.Names) 
FROM (
    SELECT 'Jenny' AS names FROM DUAL UNION ALL 
    SELECT 'Penny' FROM DUAL UNION ALL 
    SELECT 'George' FROM DUAL UNION ALL 
    SELECT 'James' FROM DUAL UNION ALL 
    SELECT 'Jessica' FROM DUAL UNION ALL 
    SELECT 'Monica' FROM DUAL UNION ALL 
    SELECT 'Erica' FROM DUAL 
) t 
LEFT OUTER JOIN NAMESTABLE n 
    ON n.names = t.names AND n.adeddate BETWEEN '2014/10/15' AND '2014/10/16' 
GROUP BY t.names 
0

這應該與CTE工作..

WITH CTE AS 
(SELECT 'Jenny' Names FROM dual UNION ALL 
SELECT 'Penny' FROM dual UNION ALL 
SELECT 'George' FROM dual UNION ALL 
SELECT 'James' FROM dual UNION ALL 
SELECT 'Jessica' FROM dual UNION ALL 
SELECT 'Monica' FROM dual UNION ALL 
SELECT 'Erica' FROM dual) 
SELECT CTE.names, coalesce(count(NT.Names),0) 
FROM CTE 
LEFT JOIN NAMESTABLE NT 
    on CTE.Names = NT.Names 
and adeddate BETWEEN '2014/10/15' AND '2014/10/16' 
GROUP BY CTE.Names 
0

您可以創建一個包含所有有效名稱的表格,如valid_names表。然後使用外連接加入您的namestable。例如:

select valid_names.name, count(1) 
from namestable, valid_names 
where valid_names.name=namestable.name (+) 
group by valid_names.name 
order by valid_names.name;