小弟最近接觸到了Oracle正在學習中!!
所以煩請各位高抬貴手。
資料表有5個欄位(c1~c5),依照日期時間(mm:dd:ss)排序,欄位的值都為'Y'or'N',
問題如下,在一個日期範圍內,若5個欄位中有超過兩個'Y'(包含兩個) ,
就select出來並且count他算這個日期區間內有多少個超過兩個的情況!
請問我該如何設定where的條件呢?
謝謝
<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
抱歉再把問題延續
我希望把它 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 遺漏右括弧,我也很確定沒有少括弧.....,是我的語法問題嗎??
謝謝
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
<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
simon大大 很謝謝你的教學&幫助,但是可以告訴我為何我的想法與case when語法 是不行的嗎??
感謝你!!
很抱歉補充一下,會這樣問是因為我必須用到 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
Wow...小雨大太專業了...
qhair1234提到:
必須用到 union
你要不要補充下你的發問?現在已經不知道你的問題在那裏了....
將兩個 Select 組合起來,我會使用到union, 兩個select的欄位必須相同,這樣我用count(*) 不會影響到其他的count嗎?
資料型態相同就可以了.
何必先自我限制,這是一些人的毛病.
問題是一小塊逐步突破,你這裡先限制怎樣不用.....
一些系統很怪,就是因為這樣先限制.
union 那部分,你再發問,把整個問題描述清楚.
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的....
謝謝兩位大大的教學與幫忙!!! 我先去把我自己該知道該了解的搞清楚再上來繼續請教各位。再一次謝謝兩位。