出産前後の痔にはご注意!

SQLでSUMなどの関数でデータが無い時に0を返したい。

(例)
SELECT SUM(項目) FROM テーブル WHERE 条件

ここで、条件に一致するデータが1件も無かった時ですが、
何かNULLのような物が1件返ってきているようです。
この条件に一致する物が無かった時に、
0を返したいのですが、可能でしょうか?

よろしくお願いします。

A 回答 (2件)

NULLが入りうるカラムはNVLで括った方が安全です。


SELECT SUM(NVL(項目,0)) from テーブル WHERE 条件

SUMの場合は、変わりないですが、AVGだと結果が違ったりします。
件名を見て、SUM以外の関数についても含むようだったので一応。
    • good
    • 2
この回答へのお礼

ご回答ありがとうございます。解決する事ができました。
この方法で対応しました。

お礼日時:2010/09/29 17:50

SELECT


CASE SUM(項目) WHEN NULL THEN 0 ELSE SUM(項目) END
FROM テーブル WHERE 条件
    • good
    • 3
この回答へのお礼

ご回答ありがとうございます。解決する事ができました。

お礼日時:2010/09/29 17:50

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

関連するカテゴリからQ&Aを探す

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Qテーブルからのselectにおいてデータの有無により結果をわけたい

id | point
----+-------
1 | 10
2 | 9
3 | 5
....
というテーブルがあるとします.
idを指定してpointを得たいのですが、そのidがこのテーブルに存在しない場合は空の結果ではなく0を返したいのです.
plpgsqlなどを使いif文で場合分けすればできることはわかっているのですがSQL文だけで(それもできれば1文で)これを実現する方法はあるでしょうか?
よろしくお願い致します。

Aベストアンサー

変則的ですが、これでよければidがユニークでなくても大丈夫ですし、集合関数を使わなくてもOKです。

select dm.id,case when ex1.point is null then 0 else ex1.point end from
(select ? as id) as dm left join ex1 on dm.id = ex1.id;

?を適当に変えてください。
chukenkenkouさんの発想はこれですよね。

QSQLサーバに対するSQL文で抽出した時にないレコードを0で表示させるには?

例えば、下記のようなデータがあったとします。

名前   出勤日  労働時間
Aさん  11月29日  8時間
Bさん  11月29日  7時間
Cさん  11月30日  9時間
Dさん  11月28日  6時間
Eさん  11月27日  3時間

これをSELECT ~ FROM テーブル名 WHERE 出勤日 = "11月29日"~とという感じで抽出した時に、
普通ならAさんとBさんのレコードのみ抽出されますよね?
それを、

名前   労働時間
Aさん   8時間
Bさん   7時間
Cさん   0時間
Dさん   0時間
Eさん   0時間

という感じで抽出するにはどのようなSQL文を書けばいいのでしょうか?
ご存知の方いらっしゃいましたら、ご教授お願いします。

Aベストアンサー

下記のように行えばOKだと思います。確認していないので間違っていたらごめんなさい。
ON以下の名前でリンクしている部分はできればそのデータ固有のIDがあれば確実です。

Select A.名前,ISNULL(B.労働時間,0) as 労働時間 From テーブル名 as A
Left Join (Select * From テーブル名 Where 出勤日 >= '2004/11/29') as B ON A.名前 = B.名前

QMAX値を条件にデータを取得するには?

SQL文で困っています。
ご教授下さい。


下記のようなデータがあった場合、それぞれの区分毎に
年月が最大(最新)のデータを取得したいです。
(実際には1レコードにその他項目があり、それらも取得します。)
<検索対象データ>
区分 年月   金額
-----------------------------
A   200412  600
A   200503  560
B   200311  600
B   200508  1000
B   200504  560
C   200508  400
C   200301  1100


<取得したいデータ>

区分 年月   金額
-----------------------------
A   200503  560
B   200508  1000
C   200508  400

よろしくお願いします。

Aベストアンサー

テーブル名をXXXとすると次のようなSQLでよいと思います。(最善の方法かどうかは自信がないですが)

select B.* from (select 区分, max(年月) as 年月 from XXX group by 区分) As A
inner join XXX as B on A.区分 = B.区分 and A.年月 = B.年月
order by B.区分

Q3つの表の外部結合

表A、B、Cの3つがあり、Aのすべての行を出力したいと考えています。
外部結合を用いるのだとは思うのですが、3つの表に対して行う場合の
書き方がわからず困っています。
ご教授いただけないでしょうか?
select * from a,b,c
where a.商品ID =b.商品ID (+) and b.商品ID (+) =c.商品ID (+)
としてみましたが、うまくいきませんでした。

Aベストアンサー

ansi構文の趣旨からいえば、結合条件と絞り込み条件は分けて書くので・・

select *
from a
left join b on (a.商品ID =b.商品ID)
left join c on (b.商品ID =c.商品ID)
where a.年月 = 任意の値

と書くのが一般的でしょうね。

Qcount集計の結果が0の場合でも表示したい

基本的なことですみません。
環境はSQLServerのクエリアナライザを使用してます。
内容は題名のとおりです。


例えば
table1

fID  fName  fItemCD
1   山田   01
2   木村   03
3   田中   04
4   佐藤   02
5   高橋   03
6   川島   03
7   山下   06


のようなものがあって、以下のSQL文を処理すると

select fItemCD, count(*) as Rslt from table1
where fItemCD in ('04','05','06')
group by fItemCD

結果
fItemCD Rslt
04    1
06    1

が返ってきます


これを
fItemCD Rslt
04    1
05    0
06    1

と結果0件のものも表示したいのですが、いい方法ありますか?

よろしくお願い致します。

Aベストアンサー

まったく存在しないものを検索するというのは無理な話なので、他にコード管理のテーブルを作ったりunionで作ったりして、その後joinするしかありません。

(1)表定義&データ例
create table table1
(fID smallint,
fName varchar(8),
fItemCD char(2));
insert into table1 values(1,'山田','01');
insert into table1 values(2,'木村','03');
insert into table1 values(3,'田中','04');
insert into table1 values(4,'佐藤','02');
insert into table1 values(5,'高橋','03');
insert into table1 values(6,'川島','03');
insert into table1 values(7,'山下','06');

create table fItemCD_Master
(fItemCD char(2),
fItemName varchar(20));
insert into FItemCD_Master values('01','A');
insert into FItemCD_Master values('02','BB');
insert into FItemCD_Master values('03','CCC');
insert into FItemCD_Master values('04','DDDD');
insert into FItemCD_Master values('05','EEEEE');
insert into FItemCD_Master values('06','FFFFFF');
insert into FItemCD_Master values('07','GGGGGGG');
insert into FItemCD_Master values('08','HHHHHHHH');
insert into FItemCD_Master values('09','IIIIIIIII');
insert into FItemCD_Master values('10','JJJJJJJJJJ');

(2)検索
select M.fItemCD,count(T.fItemCD) as Rslt
from fItemCD_Master as M
left join table1 as T
on M.fItemCD=T.fItemCD
where M.fItemCD in ('04','05','06')
group by M.fItemCD;

まったく存在しないものを検索するというのは無理な話なので、他にコード管理のテーブルを作ったりunionで作ったりして、その後joinするしかありません。

(1)表定義&データ例
create table table1
(fID smallint,
fName varchar(8),
fItemCD char(2));
insert into table1 values(1,'山田','01');
insert into table1 values(2,'木村','03');
insert into table1 values(3,'田中','04');
insert into table1 values(4,'佐藤','02');
insert into table1 values(5,'高橋','03');
...続きを読む

QSELECTで1件のみ取得するには?

こんにちわ。
いまORACLE9iを使用している者です。

ACCESSでは
SELECT TOP 1 項目名 FROM テーブル名
ORDER BY 項目名;
で並べ替えたデータ群のうち,先頭の1件だけを
取ることができますが,
ORACLEでそのような機能(SQL)はあるでしょうか?
教えてください。
よろしくお願いします。

Aベストアンサー

order by と rownum を併用する場合は注意が必要です。

[tbl01]
cola | colb
------------
1000 | aaaa
1001 | bbbb

というデータがある場合、
select cola from tbl01 where rownum < 1 order by cola desc;
とすると、「1001」ではなく、「1000」が返されます。
これは、order by の前に rownum < 1 が適用されてしまうからです。

解決するには、
select aaa from (select cola aaa from tbl01 order by cola desc) where rownum = 1;
とすれば良いです。

QInner join と Left joinの明確な違いは?

Inner join と Left joinの違いがよくわかりません。
教えてください。

Aベストアンサー

出てくる結果が違います。

テーブル1のフィールド1に、






が、

テーブル2のフィールド1に、






が入力されている場合、

SELECT [テーブル1].[フィールド1], [テーブル2].[フィールド1]
FROM テーブル1 LEFT JOIN テーブル2 ON [テーブル1].[フィールド1]=[テーブル2].[フィールド1];
では、結果は、
テーブル1.フィールド1 テーブル2.フィールド1
1               1
2               2
3               3
4               NULL
5               NULL
6               NULL
の6レコードが出力されますが、

SELECT [テーブル1].[フィールド1], [テーブル2].[フィールド1]
FROM テーブル1 INNER JOIN テーブル2 ON [テーブル1].[フィールド1]=[テーブル2].[フィールド1];
では、結果は、
テーブル1.フィールド1 テーブル2.フィールド1
1               1
2               2
3               3
の3レコードしか出力されません。

出てくる結果が違います。

テーブル1のフィールド1に、






が、

テーブル2のフィールド1に、






が入力されている場合、

SELECT [テーブル1].[フィールド1], [テーブル2].[フィールド1]
FROM テーブル1 LEFT JOIN テーブル2 ON [テーブル1].[フィールド1]=[テーブル2].[フィールド1];
では、結果は、
テーブル1.フィールド1 テーブル2.フィールド1
1               1
2               2
3           ...続きを読む

QOracle(オラクル)で、日付時刻型の検索方法について

質問させていただきます。
データベースはオラクルを使っていて、
SQL文で、抽出するときにエラーが出て困っています。

日付時刻型が「2005/05/26 19:13:00」という感じで入ってます。
2005/05/26 を抽出したいのですが、
BETWEEN '2005/05/26 00:00:00' AND '2005/05/26 23:59:59'

だと、エラーでできません。
どなた様か、ご教授よろしくお願いしますm(_ _)m

Aベストアンサー

日付検索を行う場合は、以下のように書式を含める必要があります。

col BETWEEN TO_DATE('2005/05/26 00:00:00','YYYY/MM/DD HH24:MI:SS') AND TO_DATE('2005/05/26 23:59:59','YYYY/MM/DD HH24:MI:SS')

ただ、厳密には

col >= TO_DATE('2005/05/26', 'YYYY/MM/DD')
AND
col < TO_DATE('2005/05/27', 'YYYY/MM/DD')

と書くべきでしょうね。

Q単一グループのグループ関数ではありません。

オラクル10を使っています。

select NAMAE max(TEN) from KYOUKA WHERE OK=1 and CLASS IS ('A', 'B', 'C');

で単一グループのグループ関数ではありません。
というエラーになります。

CLASS | OK | NAMAE | TEN |
--------------------------
A 1 a01 50
A 1 a02 60
B 1 b01 10
C 1 c01 70
C 0 c02 100

a02 60
b01 10
c01 70
という結果になってほしいです。

Aベストアンサー

SQLの根本的な文法が理解できていないのかと

GROUP BY 句について調べてみましょう

QSQLで特定の項目の重複のみを排除した全項目を取得する方法

私は仕事上でデータベースを扱っていて、タイトルのような処理を行う必要があるのですが、いかんせん方法がわからずネット上を検索しても同様だったためここで質問させていただきます。

質問点を簡単に説明いたしますと、
たとえばAというテーブルがあって、

項目名1 項目名2 項目名3 項目名4
 A    あ    ア    亜
 A    い    ア    以
 A    う    ア    宇
 B    え    イ    江
 B    お    イ    尾

上のような構造になっている場合に「項目名1」について重複している項目を排除し、結果として


項目名1 項目名2 項目名3 項目名4
 A    あ    ア    亜
 B    え    イ    江

上のようなデータを取得したいのです。
この時に、Aの重複を排除して取得するレコードは1~3行目のどれでもよいです。
また、データを取得する際には必ずそのレコードの「全項目」を取得したいのでDistinctはうまく使えませんでした。

どなたか詳しい方、方法を教えてくださると幸いです。回答お待ちしております。

私は仕事上でデータベースを扱っていて、タイトルのような処理を行う必要があるのですが、いかんせん方法がわからずネット上を検索しても同様だったためここで質問させていただきます。

質問点を簡単に説明いたしますと、
たとえばAというテーブルがあって、

項目名1 項目名2 項目名3 項目名4
 A    あ    ア    亜
 A    い    ア    以
 A    う    ア    宇
 B    え    イ    江
 B    お    イ    尾

上のよ...続きを読む

Aベストアンサー

比較可能で一意性のある値をもてる項目6をテーブルに追加して、

select T.* from T, (select Item1,min(Item6) as Item6 from T group by item1) W where T.item6=W.item6;

――ってやるのが、一番手っ取り早いと思います。
他のところに影響がでないのであればですが。
oracleならrowidを使うとか、レコードの更新時刻を突っ込むとか。


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング