「夫を成功」へ導く妻の秘訣 座談会

MAX値を条件にしたSQLで困っています。

以下のようなデータ(例)があります。
部番A、連番1、明細・・・
部番A、連番2、明細・・・
部番A、連番3、明細・・・
部番A、連番4、明細・・・
部番B、連番1、明細・・・
部番B、連番2、明細・・・

部番単位で、連番が最大であるデータのみを取得したいです。
上記の例だと、
部番A、連番4、明細・・・
部番B、連番2、明細・・・
の2件です。

SQLをご教授ください。
よろしくお願いします。

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

A 回答 (1件)

select * from hoge where (部番,連番) in (select 部番,max(連番) from hoge group by 部番);


とか
select * from
(select hoge.*,row_number() over(partition by 部番 order by 連番 desc) R from hoge)
where R=1;
とかで良いかと。
    • good
    • 0
この回答へのお礼

ご教授通りで解決しました!
有難うございました。

お礼日時:2010/03/08 12:15

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

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

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

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

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

このQ&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.区分

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さんの発想はこれですよね。

QINSERT時にデータ登録とmaxの発番がしたい

<環境>
SQLSERVER 2012

入力フォームに、入力した後で、DBに登録した際に、
依頼Noに、既にあるデータのMAX+100の値を登録したいです。

依頼NoにMAX+100の連番をふることは以下の方法でできたのですが、

INSERT INTO テーブル1(依頼No)
SELECT MAX(依頼No)+100 AS NEW_ID FROM テーブル1



入力フォームのデータと登録と同時に、依頼Noを振りたいのですができません。
以下のように書いてみましたが、
根本的に間違っていると思うので、いい方法をご教授いただけたらと思います。


※iraibi は入力フォームで、依頼日を入力した値です。

INSERT INTO テーブル1 (依頼No,依頼日) VALUES ('SELECT MAX(依頼書No)+100 AS NEW_ID FROM テーブル1','" & iraibi & "')

宜しくお願いいたします。

Aベストアンサー

INSERT INTO テーブル1(依頼No, 依頼日)
SELECT MAX(依頼No)+100, '2013/05/13' FROM テーブル1

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

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')

と書くべきでしょうね。

QINSERT時に発番を行いたい

ATBLからBTBLへのINSERT時発番を行いたい

<環境>
SQLSERVER 2008

<ATBL>
CDvarchar(3)KEY
NOintKEY
NAMEvarchar(10)

<BTBL>
CDvarchar(3)KEY
NOintKEY
NAMEvarchar(10)

<BTBLのデータ>
CD   NO  NAME
0011太郎
0013次郎
0015三郎

BTBLをATBLへINSERTしたいのですが、この時、NOを1から再付番したいのです。
INSERTクエリで一発で更新できますでしょうか?
ご教授お願いします。

Aベストアンサー

row_numberで1からの連番ふれるよ

INSERT INTO ATBL(CD, NO, NAME)
SELECT CD, row_number() OVER(ORDER BY CD) AS NO, NAME FROM BTBL

参考URL:http://msdn.microsoft.com/ja-jp/library/ms186734.aspx

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を使うとか、レコードの更新時刻を突っ込むとか。

QSQL 特定のカラムが最大値のレコード取得

初心者です。SQL文で困っています。
どなたかご教授頂けたらと思います。

環境は、SQL SERVER 2000です。
特定のカラムが最大値のレコードのみ取得したいです。
たとえば、以下のようなデータがあるとします。
コード、履歴番号で主キーとします。
コード|履歴番号 |金額
0001 |1 |12000
0001 |2 |12001
0001 |3 |12002
0002 |1 |12000
0002 |2 |12001
0002 |3 |12002
0003 |1 |12000
0003 |2 |12001
この場合に、コード毎に履歴番号が最大のレコードのみを取得したいです。
理想の結果は以下になります。
コード|履歴番号 |金額
0001 |3 |12002
0002 |3 |12002
0003 |2 |12001

以上です。よろしくお願いいたします。

Aベストアンサー

SQL Server 2000で動くかどうか分かりませんが、SQL例です。

select *
from t1 as x
where 履歴番号=(select max(履歴番号)
from t1
where コード=x.コード)
order by コード

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以外の関数についても含むようだったので一応。

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


人気Q&Aランキング