iT邦幫忙

0

關於Oracle資料庫語法!!(Count)

小弟最近接觸到了Oracle正在學習中!!

所以煩請各位高抬貴手。

資料表有5個欄位(c1~c5),依照日期時間(mm:dd:ss)排序,欄位的值都為'Y'or'N',

問題如下,在一個日期範圍內,若5個欄位中有超過兩個'Y'(包含兩個) ,

就select出來並且count他算這個日期區間內有多少個超過兩個的情況!

請問我該如何設定where的條件呢?

謝謝

看更多先前的討論...收起先前的討論...
賽門 iT邦超人 1 級 ‧ 2016-03-16 18:33:51 檢舉
你可以參加{FLYING ITMEN}Oracle PL/SQL 與 PostgreSQL PL/PgSQL 入門與應用....現場有大師親身教授....
偷笑
qhair1234 iT邦新手 5 級 ‧ 2016-03-17 09:15:48 檢舉
很謝謝你的推薦喔!!! 謝謝
賽門 iT邦超人 1 級 ‧ 2016-03-17 13:30:07 檢舉
感謝小雨大的指導....
謝謝
qhair1234 iT邦新手 5 級 ‧ 2016-03-18 10:00:18 檢舉
很謝謝 小雨大 和 Simon大大 的幫忙!!

1 個回答

8
賽門
iT邦超人 1 級 ‧ 2016-03-16 21:34:46
最佳解答
<pre class="c" name="code">Where (DECODE(Field1, 'Y', 1, 0) + 
       DECODE(Field2, 'Y', 1, 0) + 
       DECODE(Field3, 'Y', 1, 0) + 
       DECODE(Field4, 'Y', 1, 0) + 
       DECODE(Field5, 'Y', 1, 0)) > 1
看更多先前的回應...收起先前的回應...
qhair1234 iT邦新手 5 級 ‧ 2016-03-17 09:14:30 檢舉

抱歉再把問題延續

我希望把它 count 出來所以我寫了以下程式

count(case when ((DECODE(Field1, 'Y', 1, 0) + DECODE(Field2, 'Y', 1, 0))>1 then 1 end) as YY_Total

先說自己的想法當 Field1,Field2有'Y'時會回傳1(N時傳0),之後相加大於1的再count。

但是這想法一直有 ora-00907 遺漏右括弧,我也很確定沒有少括弧.....,是我的語法問題嗎??

謝謝

賽門 iT邦超人 1 級 ‧ 2016-03-17 09:21:22 檢舉

Select COUNT(*)
From Table1
Where (DECODE(Field1, 'Y', 1, 0) +
DECODE(Field2, 'Y', 1, 0) +
DECODE(Field3, 'Y', 1, 0) +
DECODE(Field4, 'Y', 1, 0) +
DECODE(Field5, 'Y', 1, 0)) > 1

賽門 iT邦超人 1 級 ‧ 2016-03-17 09:22:34 檢舉
<pre class="c" name="code">Select COUNT(*)
  From Table1
 Where (DECODE(Field1, 'Y', 1, 0) +
        DECODE(Field2, 'Y', 1, 0) +
        DECODE(Field3, 'Y', 1, 0) +
        DECODE(Field4, 'Y', 1, 0) +
        DECODE(Field5, 'Y', 1, 0)) > 1
qhair1234 iT邦新手 5 級 ‧ 2016-03-17 10:32:00 檢舉

simon大大 很謝謝你的教學&幫助,但是可以告訴我為何我的想法與case when語法 是不行的嗎??

感謝你!!

qhair1234 iT邦新手 5 級 ‧ 2016-03-17 10:34:26 檢舉

很抱歉補充一下,會這樣問是因為我必須用到 union 所以不行用到Count(*),所以我才再發問 謝謝

<pre class="c" name="code">create table ithelp160317a(
   id int not null
,  col1 char(1) not null
,  col2 char(1) not null
,  col3 char(1) not null
,  col4 char(1) not null
,  col5 char(1) not null
);

insert all
into ithelp160317a values(1, 'N', 'N','Y','N','N')
into ithelp160317a values(2, 'Y', 'N','N','N','N')
into ithelp160317a values(3, 'Y', 'N','Y','N','N')
into ithelp160317a values(4, 'Y', 'N','N','N','N')
SELECT 1
  FROM DUAL;
  
--
SELECT id
  FROM ithelp160317a
 WHERE length(replace(col1 || col2 || col3 || col4 || col5, 'N', '')) > 1; 

        ID
----------
         3

SELECT count(1)
  FROM ithelp160317a
 WHERE length(replace(col1 || col2 || col3 || col4 || col5, 'N', '')) > 1; 

  COUNT(1)
----------
         1
賽門 iT邦超人 1 級 ‧ 2016-03-17 11:12:53 檢舉

Wow...小雨大太專業了...
讚

賽門 iT邦超人 1 級 ‧ 2016-03-17 11:15:55 檢舉

qhair1234提到:
必須用到 union

你要不要補充下你的發問?現在已經不知道你的問題在那裏了....
偷笑

qhair1234 iT邦新手 5 級 ‧ 2016-03-17 11:35:40 檢舉

將兩個 Select 組合起來,我會使用到union, 兩個select的欄位必須相同,這樣我用count(*) 不會影響到其他的count嗎?

資料型態相同就可以了.
何必先自我限制,這是一些人的毛病.
問題是一小塊逐步突破,你這裡先限制怎樣不用.....
一些系統很怪,就是因為這樣先限制.
union 那部分,你再發問,把整個問題描述清楚.

賽門 iT邦超人 1 級 ‧ 2016-03-17 11:46:59 檢舉

UNION是把多個獨立的SELECT聯集。
只要SELECT出來的欄位名稱及欄位Data Type相同,就能UNION在一起。
所以...

<pre class="c" name="code">SELECT COUNT(1) 總數 FROM TABLE1 WHERE ....
UNION
SELECT COUNT(1) 總數 FROM TABLE2 WHERE ....
UNION
SELECT COUNT(1) 總數 FROM TABLE3 WHERE ....
UNION
....

是OK的。

此外,最好不要用COUNT(*),效能不太好,我做了個錯誤示範。

oracle 用 count(*) 是比較好的,
他會自己挑適當的index, 而不是傳遞"每個欄位",
count(*), 與 * 實際操作上不同!
count(*) 就是都要count,指定欄位反而不好,手殘挑到沒index的....

qhair1234 iT邦新手 5 級 ‧ 2016-03-17 11:54:13 檢舉

謝謝兩位大大的教學與幫忙!!! 我先去把我自己該知道該了解的搞清楚再上來繼續請教各位。再一次謝謝兩位。

我要發表回答

立即登入回答