プロが教えるわが家の防犯対策術!

基本的なことですみません。
環境は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 回答 (1件)

まったく存在しないものを検索するというのは無理な話なので、他にコード管理のテーブルを作ったり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;
    • good
    • 0
この回答へのお礼

遅くなりましたが、
大変参考になりました。
ありがとうございました。
結局ないものをカウントすること自体がナンセンスなのですね。。。

お礼日時:2007/02/01 10:37

お探しの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でSUMなどの関数でデータが無い時に0を返したい。

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

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

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

よろしくお願いします。

Aベストアンサー

NULLが入りうるカラムはNVLで括った方が安全です。
SELECT SUM(NVL(項目,0)) from テーブル WHERE 条件

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

QCOUNTの取得方法(?)について質問があります。

COUNTの取得方法(?)について質問があります。

現在次のSQL文を投げると

SELECT
   ITEM
  ,COUNT(ITEM)
FROM
  ITEM_MASTER
WHERE
  ITEM IN ('000', '100', '200', '300', '400')
GROUP BY
  ITEM
ORDER BY
  ITEM
;

このような結果が返ってきます。

ITEM  COUNT(ITEM)
------ -----------
100       9
200       2
300       1


ITEMの値が000と400の件数は0件なのですが、0件の場合には、
次のように0と表示したい場合はどのようにしたら良いのでしょうか?

ITEM  COUNT(ITEM)
------ -----------
000       0 <--ここ
100       9
200       2
300       1
400       0 <--ここ

よろしくお願いします。

COUNTの取得方法(?)について質問があります。

現在次のSQL文を投げると

SELECT
   ITEM
  ,COUNT(ITEM)
FROM
  ITEM_MASTER
WHERE
  ITEM IN ('000', '100', '200', '300', '400')
GROUP BY
  ITEM
ORDER BY
  ITEM
;

このような結果が返ってきます。

ITEM  COUNT(ITEM)
------ -----------
100       9
200       2
300       1


ITEMの値が000と400の件数は0件なのですが、0件の場合には、
次のように0と表示したい場合はどのようにした...続きを読む

Aベストアンサー

対象データが存在しないモノは抽出のしようがありません。

どこにも存在しないのであれば、便宜上作るしかありません。

selec ITEM,COUNT(*)
from
ITEM_MASTER,
(
select '000' as KEY from dual union all
select '100' as KEY from dual union all
select '200' as KEY from dual union all
select '300' as KEY from dual union all
select '400' as KEY from dual
) M
where ITEM=M.KEY
group by ITEM
order by ITEM
;

抽出条件も兼ねたインラインビューとしています。

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.年月 = 任意の値

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

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.区分

QSQL文で、合計が0のレコードを表示させないようにしたい。

売上のテーブルがありまして、
数量の合計と金額の合計を出していたのですが、
数量の合計が0の場合は表示させないことになり、
下記のようにしてみたのですが、エラーになってしまいます。
かといって、Sum(売上マスタ.数量) <> 0 でもダメでしたし、どうしていいのか困っています。
どうぞ、ご教授よろしくお願いしますm(_ _)m

SELECT Sum(売上マスタ.数量) AS 数量の合計, 売上マスタ.単価*数量の合計 AS 売上金額 FROM 売上マスタ Where 売上マスタ.数量 <> 0;

Aベストアンサー

たしか計算後の指定はhavingでやらないといけなかったのではないでしょうか。

SELECT Sum(売上マスタ.数量) AS 数量の合計, 売上マスタ.単価*数量の合計 AS 売上金額 FROM 売上マスタ Having 売上マスタ.数量 <> 0;

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.名前

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           ...続きを読む

Qcount(1)とcount(*)の違い

初心者です。
以下のSQL文の違い及びcount(1)の1が何を表しているのか
教えて頂けないでしょうか?

select count(*) from table
select count(1) from table

また、参考しやすいサイト等ありましたら教えて頂けないでしょうか?

Aベストアンサー

COUNT(*)はNULLを含む件数
COUNT(expr)とCOUNT(ALL expr)はexpr列のNULLが含まない件数
COUNT(DISTINCT expr) expr列の種類(null以外)
です。
たまにcount(1)の記述を確かに見受けます。
これは「select 1 from <TABLE名>」でカウントした結果と同じです。
(つまり、count(*)と同じ件数になるはず)
#ためしにCOUNT(DISTINCT 1)とかすると1になるはずです
#1番目の列ではないはず

Q2つのテーブルのカウント結果を1行で取得

以下のようなデータ件数のテーブルが、別々のDBにあります。

SELECT COUNT(*) FROM AA.TBL01

------
TBL01
------
10


SELECT COUNT(*) FROM BB.TBL02

------
TBL02
------
5


それぞれのテーブルのカウント結果を、1行で取得する
ことは可能でしょうか?

<取得したい結果>
----------------
TBL01 TBL02
----------------
10 5


よろしくお願いします。
(SQL Server2005 Standard)

Aベストアンサー

テーブル2つ程度なら、これでもいいかと思います。
SELECT
(SELECT COUNT(*) FROM AA.TBL01) TBL01,
(SELECT COUNT(*) FROM BB.TBL02) TBL02


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

人気Q&Aランキング