2013-01-21 33 views
1

我有一個表如下所示要計算的特定值的occurence的數目在表中

Col1 Col2 Col3 
*   $  * 
$   *  * 
#   *  $ 
%   *  * 
*   *  $ 
*   @  $ 

我想要一個SQL查詢來計數分(*)存在於該表中的號碼。

一種選擇是按以下方式編寫查詢。

select ((select count(*) from star_table where col1='*') + 
(select count(*) from star_table where col2='*') + 
(select count(*) from star_table where col3='*')) as count from dual. 

我想知道是否有其他方法來編寫查詢以獲得相同的結果。

回答

2
select sum(
      case when col1='*' then 1 else 0 end + 
      case when col2='*' then 1 else 0 end + 
      case when col3='*' then 1 else 0 end    
     ) 
from star_table; 

UPDATE:如果您的列包含字符長度的字符串,您可以:

select sum(3 - length(replace(col1||col2||col3,'*'))) 
from star_table; 

你問這個:)

+0

這很好:)任何更簡單的查詢plzzzzz –

+0

這比你的更快。掃描而不是三個。不過,我會考慮一個更小的版本。 –

+0

+1爲邏輯:) – TechDo

1

請嘗試:

SELECT SUM(
    (CASE WHEN Col1='*' THEN 1 ELSE 0 END)+ 
    (CASE WHEN Col2='*' THEN 1 ELSE 0 END)+ 
    (CASE WHEN Col3='*' THEN 1 ELSE 0 END)) 
FROM TableName 
0

這個怎麼樣?

SQLFIDDLE MYSQL DEMO

select sum(col1='*') + sum(col2='*') + sum(col3='*') 
from yourtable 

對於SQL Server這裏是:

select sum(patindex('*',col1)) + 
sum(patindex('*',col2)) + 
sum(patindex('*',col3)) 
from stars 
; 

SQLFIDDLE SQL SERVER DEMO

結果:

| TOTALSTARS | 
-------------- 
|   10 | 

我誤會了你的SQL開發人員到SQL Server,直到林指出了這一點,在這裏不用的甲骨文版本:

SQLFIDDLE DEMO ORACLE

select sum(instr('*',col1)) + 
sum(instr('*',col2)) + 
sum(instr('*',col3)) as TotalStars 
from stars 
; 

結果:

| TOTALSTARS | 
-------------- 
|   10 | 
+0

不是它不工作 –

+0

http://www.sqlfiddle.com/#!2/24671/3檢查了這一點,似乎是相同的結果:)你能告訴預期的答案嗎? – bonCodigo

+1

再次,這是Oracle不是MySql。在Oracle SQL中,你沒有布爾值,關於添加布爾值怎麼說? :) –

0

這件怎麼樣?

select sum(decode(col1,'*',1,0)+decode(col2,'*',1,0)+decode(col3,'*',1,0)) 
    from tab; 
+0

乾杯!好一個:) –