人に聞けない痔の悩み、これでスッキリ >>

表A           表B
商品ID 数量 価格    商品ID 商品名 
------ ---- ----    ------ ------
0001   10 1000    0001  万年筆
0002   50 200     0002  ボールペン
0003   25 600     0003  シャーペン
0004   150 2000    0004  文房具セット
0005   20 420     0005  ノート

SELECT 数量,価格,商品名,商品ID
FROM 表A,表B
WHERE 表A.商品ID = 表B.商品ID

とやると恐らくこんなような表ができると思います。

商品ID 数量 価格 商品名 
------ ---- ---- ------
0001  10   1000 万年筆
0002  50   200 ボールペン
0003  25   600 シャーペン
0004  150  2000 文房具セット
0005  20   420 ノート

ここで、表の行数を6で割ったときの余りの数を表に追加して全体の行数を6の倍数にしたいと思っています。
(ID 0006として空行を追加)
しかし、この表の行数を取得するためにCOUNT関数を使うと思うのですが、使い方が分かりません。
COUNT関数を使うにはGROUP BY句とHAVING句を扱うらしいのですがSELECT句にある列名全部をGROUP BY句に入れないといけないらしく思ったとおりのことが出来ません。
上記のSQLとCOUNT関数を1つのSQLで表の作成と行の行数を得たいと思っています。(ここでは、5行なので5という値を取得したい。)
また、最後にどうやって空行を追加すれば良いかも分かりません。
具体的なSQLのソースなど、どなたか分かりましたら、教えてください。

このQ&Aに関連する最新のQ&A

A 回答 (1件)

行数が6の倍数でなかったら、最大の商品IDの続きでダミー行を補う、というクエリのサンプルは以下のようになります。


何もないところから行は生み出せないので、5行の空行を生成し、余りに応じて使います。
必要な情報は入っていると思いますので、中身をみてください。

SELECT a.商品ID,a.数量,a.価格,b.商品名
FROM 表A a,表B b
WHERE a.商品ID=b.商品ID

UNION ALL

SELECT
RIGHT('0000'+CONVERT(varchar,(CONVERT(int,c.MAXID)+t.SEQ)),4) 商品ID,
数量,価格,商品名
FROM
(SELECT 1 SEQ,NULL 数量,NULL 価格,NULL 商品名
UNION ALL
SELECT 2, NULL,NULL,NULL
UNION ALL
SELECT 3, NULL,NULL,NULL
UNION ALL
SELECT 4, NULL,NULL,NULL
UNION ALL
SELECT 5, NULL,NULL,NULL) t,
(SELECT
COUNT(*)%6 PAGEROW,
ISNULL(MAX(a.商品ID),'0000') MAXID
FROM 表A a,表B b WHERE a.商品ID=b.商品ID) c
WHERE t.SEQ<=(6-PAGEROW) AND c.PAGEROW<>0
    • good
    • 0
この回答へのお礼

返事が遅れてしまい、大変申し訳ございませんでした。
まだ、SQLについて素人同然で、見たことの無い関数が多くなんとか理解することが出来ました。
本当にありがとうございました。

お礼日時:2008/09/08 09:37

このQ&Aに関連する人気のQ&A

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

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

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

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

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テーブルからの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さんの発想はこれですよね。

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

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;
とすれば良いです。

Qcount関数の値をwhere句で使用する方法について

宜しくお願い致します。
例えば、下記の様にデータを検索します。

select column1,count(column2) as column2_num
from hoge_table
group by column2_num

すると、検索結果にはcolumn1のそのままの値と、column2の合計数が表示されると思います。
このcolumn2の合計数に対してwhere句で絞込みを行う方法はありませんか?
asで定義した値をそのままwhere句で使用できないとの事なので、

select column1,count(column2) as column2_num
from hoge_table
where count(column2) = '1'
group by column2_num

とやってみたんですが、検索出来ませんでした。
ご存知の方、ご教授の程、宜しくお願いいたします。

Aベストアンサー

グルーピングした値を条件にするにはwhereではなくhavingを使います。以下のようにしてみてください。

select column1,count(column2) as column2_num
from hoge_table
group by column2_num
having count(column2) = 1

QSQLで違うテーブルの値を比較して値に差があるレコードを抽出したいので

SQLで違うテーブルの値を比較して値に差があるレコードを抽出したいのですがヒントをいただけないでしょうか。
下に例を作ってみました。(テキストに貼りなおしてもらうと見易くなると思います)
<Aテーブル>
A1A2A3A4A5
------- ------- ------- ------- ----------
XXXXXXX XX1ABC32009/05/08
WWCWWCW WW2CCB12008/03/21
DDDDDDD DD1JPN52007/08/08
GGGGGGG GX9SOX21977/01/04
FFFFFFF USJNPB32001/09/11


<Bテーブル>
B1B2B3B4B5
------- ------- ------- ------- ----------
XXXXXXX XX1ibichaoshimu2002/07/05
XXXXXXX XX1takeshiokada2005/07/15
XXXXXXX XX1kamoshu1857/09/25
WWCWWCW WW2waowao2008/10/22
DDDDDDD DD1uihhh2006/06/30
DDDDDDD DD1jojoj x5xx1999/09/09
DDDDDDD DD1momohara2005/03/07
DDDDDDD DD1itaiu-2003/12/22
DDDDDDD DD1komanogoal2007/04/26
GGGGGGG GX9 damerecord2009/11/14
FFFFFFF USJ ikitai1995/08/15
FFFFFFF USJ sstebuspi2004/01/05
FFFFFFF USJ bbpp2009/08/23

A1とB1は主キー、A2とB2は副キーです。
Aテーブルの「A4」カラムにはBテーブルのレコード数を持っています。(主キー、副キーが同じものの)
しかし、よくよく見るとAテーブルの「GGGGGGG」のA4には「2」のはずなのにBテーブルには実際にレコードは1つしかありません。
こういう状態になってしまっているのを割り出したいのですがどのようにA4とBテーブルで数があってないものを抽出できるでしょうか。
よろしくお願いいたします。

SQLで違うテーブルの値を比較して値に差があるレコードを抽出したいのですがヒントをいただけないでしょうか。
下に例を作ってみました。(テキストに貼りなおしてもらうと見易くなると思います)
<Aテーブル>
A1A2A3A4A5
------- ------- ------- ------- ----------
XXXXXXX XX1ABC32009/05/08
WWCWWCW WW2CCB12008/03/21
DDDDDDD DD1JPN52007/08/08
GGGGGGG GX9SOX21977/01/04
FFFFFFF USJNPB32001/09/11


<Bテーブル>
B1B2B3B4B5
------- ------- ------- ------- ----------
XXXXXXX XX1ibichaoshimu200...続きを読む

Aベストアンサー

SELECT A.* FROM Aテーブル A
INNER JOIN
TABLE(SELECT B1,B2,COUNT(*) SU
FROM Bテーブル GROUP BY B1,B2) B
ON A.A1=B.B1 AND A.A2=B.B2
AND A.A4<>B.SU

または

WITH B(B1,B2,SU) AS
(SELECT B1,B2,COUNT(*) SU
FROM Bテーブル GROUP BY B1,B2)
SELECT A.* FROM Aテーブル A
INNER JOIN B ON A.A1=B.B1
AND A.A2=B.B2 AND A.A4<>B.SU

こんなのでどうでしょうか?
後者の方が標準的(他のDBシステムでも
使える可能性が高い)かと思います。


人気Q&Aランキング