見守り電球またはGPS端末が特価中!

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 回答 (5件)

テーブル名を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.区分
    • good
    • 31
この回答へのお礼

早々のご回答ありがとうございました。
inner joinを使えばよかったんですね。
希望通りのデータを取得することが出来ました!

お礼日時:2005/06/10 22:47

すいません、下の#4のSQLに1箇所間違いがありました。



select WK1.区分, WK1.年月,
    WK2.金額
 from テーブルA WK2,
    (select max(年月) as 年月,
        区分 as 区分
      from テーブルA
         ~~~~~~~~~~
    group by 区分) WK1
where WK2.区分 = WK1.区分
 and WK2.年月 = WK1.年月
    • good
    • 17
この回答へのお礼

ご回答ありがとうございました。
サブクエリーのうまく出来ず、悩んでいましたが
理解できました。
希望通りのデータを取得することが出来ました!

皆様、ありがとうございました。
いくつか方法を教えた頂きましたので、あとは実際に
早く取得できる方を使ってみようと思います。

お礼日時:2005/06/10 22:52

副問合せを使って以下のようなSQLではいかがでしょうか(^^;



select WK1.区分, WK1.年月,
WK2.金額
from テーブルA WK2,
(select max(年月) as 年月,
区分 as 区分
from テーブルB
group by 区分) WK1
where WK2.区分 = WK1.区分
and WK2.年月 = WK1.年月
    • good
    • 4

間違えました。



SELECT *,MAX(金額) FROM テーブル名 GROUP BY 区分

これでどうでしょうか?
    • good
    • 2
この回答へのお礼

ご回答ありがとうございました。
でも、これだと「年月が最大(最新)のデータ」と
いう条件がつかなかったです。

お礼日時:2005/06/10 22:44

年月をグループ化して、金額の最大値を取得ってところでしょうか?



SELECT *,MAX(金額) FROM テーブル名 GROUP BY 年月

これでどうでしょうか?
    • good
    • 11

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

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

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

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

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

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 コード

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

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

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

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複数列の最大値を求めたい

SQLServerでOracleのGREATEST関数のような事がしたいです。

具体的に書きますと、

ID | 列1 | 列2 | 列3 | 列4 | 列5
------------------------------
01 | 700 | 200 | 300 | 400 | 100
02 | 100 | 800 | 200 | 300 | 200
03 | 100 | 300 | 900 | 100 | 100

という表があった場合に

ID | 最大値
------------------------------
01 | 700
02 | 800
03 | 900

といった結果を求めたいです。

CASE等を利用するしか方法はないのでしょうか。

Aベストアンサー

SELECT ID,MAX(列) AS 最大値 FROM
(SELECT ID,列1 AS 列 FROM テーブル
UNION ALL SELECT ID,列2 AS 列 FROM テーブル
UNION ALL SELECT ID,列3 AS 列 FROM テーブル
UNION ALL SELECT ID,列4 AS 列 FROM テーブル
UNION ALL SELECT ID,列5 AS 列 FROM テーブル) AS TBL
GROUP BY ID ORDER BY 1
でどうでしょうか。

QSQL MAX関数を検索条件にする。

SQL MAX関数を検索条件にする。

わかる方がいれば助けてください。
下記のようなデータのテーブルあります。

  ID        品番      金額          日付
OUTLET 210  00182-1080   5600         20090915
OUTLET 214 00182-1080   5600         20090916
OUTLET 217 00182-1080   5600         20090917
OUTLET 50 00182-1080   5600         20090609
OUTLET 437 00191-1082   3300         20100305
BLK09SS703 00191-1082   5500         20090703
OUTLET 141 00191-1082   5500         20090717
OUTLET 170 00191-1082   5500         20090806

このテーブルデータの各品番について最新日付のデータのみを出力したいのですが、
方法がわかりません。group byでHAVING検索なども試しましたがうまくいきませんでした。

<抽出したいデータ>
  ID        品番      金額          日付
OUTLET 217 00182-1080   5600         20090917
OUTLET 437 00191-1082   3300         20100305

どなたかお願いします。
前にも同じような質問をさせていただきましたが、
解決できずにこまっています。

SQL MAX関数を検索条件にする。

わかる方がいれば助けてください。
下記のようなデータのテーブルあります。

  ID        品番      金額          日付
OUTLET 210  00182-1080   5600         20090915
OUTLET 214 00182-1080   5600         20090916
OUTLET 217 00182-1080   5600         20090917
OUTLET 50 00182-1080   5600         20090609
OUTLET 437 00191-1082   3300         20100305
BLK09SS703 001...続きを読む

Aベストアンサー

下記のSQL文を参照してください。

SELECT
TB1.ID ,
TB1.HINBAN , -- 品番(HINBAN) [ VARCHAR2(20) NULL ]
TB1.KINGAKU , -- 金額(KINGAKU) [ NUMBER(7,0) NULL ]
TB1.HIZUKE -- 日付(HIZUKE) [ VARCHAR2(8) NULL ]
FROM TEST_TABLE TB1
INNER JOIN( SELECT
HINBAN , -- 品番(HINBAN) [ VARCHAR2(20) NULL ]
MAX(HIZUKE) AS HIZUKE -- 日付(HIZUKE) [ VARCHAR2(8) NULL ]
FROM TEST_TABLE
GROUP BY HINBAN -- 品番(HINBAN) [ VARCHAR2(20) NULL ]
) TB2
ON TB1.HINBAN = TB2.HINBAN -- 品番(HINBAN) [ VARCHAR2(20) NULL ]
AND TB1.HIZUKE = TB2.HIZUKE -- 日付(HIZUKE) [ VARCHAR2(8) NULL ]

注:SQL文実行の結果は添付画像を参照してください。

下記のSQL文を参照してください。

SELECT
TB1.ID ,
TB1.HINBAN , -- 品番(HINBAN) [ VARCHAR2(20) NULL ]
TB1.KINGAKU , -- 金額(KINGAKU) [ NUMBER(7,0) NULL ]
TB1.HIZUKE -- 日付(HIZUKE) [ VARCHAR2(8) NULL ]
FROM TEST_TABLE TB1
INNER JOIN( SELECT
HINBAN , -- 品番(HINBAN) [ VARCHAR2(20) NULL ]
MAX(HIZUKE) AS HIZUKE -- 日付(HIZU...続きを読む

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

QSELECT 文 GROUP での1件目を取得

非常に初歩的な事で恐縮ですが、
以下のデータを抽出するsql文の書き方を模索しています。
環境:SQLSERVER2005

| 列1| 列2 |
+---+---+
| 1 | A |
| 1 | B |
| 1 | C |
| 1 | D |
| 2 | F |
| 2 | G |
| 2 | H |
| 3 | X |
| 3 | Y |
| 3 | Z |

上記のテーブルがあるとします。
列1でグループした値で、1レコード目の列2を抽出したいのです。
出力結果としては、

列1列2
+--+--+
1,A
2,F
C,X

としたいのです。
列1でGROUPしてしまうと列2の内容を集約しないといけないので困っています。
ご教授いたけないでしょうか?

Aベストアンサー

SQL Server 2005では、Oracleでいう分析関数が実装されています。

select
列名1,
列名2
from
(select
rank() over(partition by 列1 order by 列2) as rk,
列1,列2
from 表名) as x
where rk=1

QMAX関数を使ってからLEFT JOINしたいのですが・・

毎度お世話になります。
下記2つのテーブルからテーブル結合をして表示させたいのですが、その前にサブテーブルにある時間データの中で最新のものだけと結合したいと考えています。色々試したのですがうまくいきません。どなたかご教授の程よろしくお願いいたします。

main_tbl
| id | basyo | name |
---------------------
| 1 | 1  | aa  |
| 2 | 1  | bb  |
| 3 | 2  | cc  |
| 4 | 3  | dd  |

sub_tbl
| id | jyotai | time  |
------------------------
| 1 | 1   |12:25:30|
| 1 | 2   |13:15:12|
| 2 | 1   |13:20:14|
| 1 | 3   |13:50:08|

欲しい結果
| id | basyo | name | jyotai | time |
---------------------------------------
| 1 | 1  | aa  | 3   |13:50:08|
| 2 | 1  | bb  | 1   |13:15:12|
| 3 | 2  | cc  | null  | null |
| 4 | 3  | dd  | null  | null |

考えた構文
$sql = "SELECT main_tbl.id, main_tbl.basyo, main_tbl.name, sub_tbl.jyotai, sub_tbl.time FROM main_tbl LEFT OUTER JOIN (SELECT MAX(time) FROM sub_tbl GROUP BY id) ON main_tbl.id = sub_tbl.id";
または
$sql = "SELECT main_tbl.id, main_tbl.basyo, main_tbl.name, sub_tbl.jyotai, sub_tbl.time FROM main_tbl LEFT OUTER JOIN sub_tbl on main_tbl.id = sub_tbl.id WHERE SELECT MAX(time) FROM sub_tbl GROUP BY id";
または
$sql1 = "SELECT MAX(time) FROM sub_tbl GROUP BY id";
$rs1 = mysql_db_query($db,$sql1) or die("sql Error!");
$sql = "SELECT main_tbl.id, main_tbl.basyo,main_tbl.name, $rs1.jyotai, $rs1.time FROM main_tbl LEFT OUTER JOIN $rs1 ON main_tbl.id = $rs1.id";

~以下クエリの実行と表示文~

どれも駄目でした。(クエリエラー表示)

因みに結合のみとMAX関数を別々に実行すると表示できることを確認しています。

環境は
WinXP
Mysql5.0.41
php5.2.3
です。
まだまだ勉強中ですのでよろしくお願いいたします。

毎度お世話になります。
下記2つのテーブルからテーブル結合をして表示させたいのですが、その前にサブテーブルにある時間データの中で最新のものだけと結合したいと考えています。色々試したのですがうまくいきません。どなたかご教授の程よろしくお願いいたします。

main_tbl
| id | basyo | name |
---------------------
| 1 | 1  | aa  |
| 2 | 1  | bb  |
| 3 | 2  | cc  |
| 4 | 3  | dd  |

sub_tbl
| id | jyotai...続きを読む

Aベストアンサー

もう少しすっきりした文になるかも知れませんが、とりあえず以下のSQL文でどうでしょう。


select
m.id, m.basyo, m.name, y.jyotai, y.time
from
main_tbl m
left join ( select
s.id, s.jyotai, s.time
from
sub_tbl s,
( select
id, max(time) maxtime
from
sub_tbl
group by id) x
where s.id = x.id and s.time = x.maxtime) y
on m.id = y.id


■考え方
1.sub_tblから、id毎に最大時間のデータを抽出したテーブルを作成し、xとする。
select id, max(time) maxtime from sub_tbl group by id


2.xとsub_tblを等価結合することでsub_tblからid毎に最大時間を持つ行を抽出したテーブルを作成し、yとする。
select s.id, s.jyotai, s.time from sub_tbl s , x where s.id = x.id and s.time = x.maxtime

 ※この手順は、最大時間を持つ行のjyotaiを取得するため。


3.main_tblとyを外部結合する。
select m.id, m.basyo, m.name, y.jyotai, y.time from main_tbl m left join y on m.id = y.id

もう少しすっきりした文になるかも知れませんが、とりあえず以下のSQL文でどうでしょう。


select
m.id, m.basyo, m.name, y.jyotai, y.time
from
main_tbl m
left join ( select
s.id, s.jyotai, s.time
from
sub_tbl s,
( select
id, max(time) maxtime
from
sub_tbl
group by id) x
where s.id = x.id and s.t...続きを読む

Q2つのテーブルから条件に一致しないデータ抽出

2つのテーブルから条件に一致しない行のみ抜き出しCSV
か他のテーブルに抜き出す処理を作ろうと思っています。

そこで質問なのですが、以下の2つのテーブルから
条件に一致しないコードのみ抜き出すSQL文などありますか?

-----------------------------------------
マスターテーブル
コード、ネーム1、ネーム2、店コード
1、あ、い、6
2、う、え、8
3、お、か、4
4、き、く、2


店コードテーブル
店コード、店区分
1、スーパー
2、コンビニ
3、デパート
4、ホームセンター
------------------------------------------

条件は、マスターテーブルの店コードが店コードテーブルに存在
しないデータのみ抽出です。

抽出結果は、以下の様にしたいです。
1、あ、い、6
2、う、え、8

このような考え大丈夫でしょうか?
SELECT *
FROM マスターテーブル AS M INNER JOIN 店コードテーブル AS S
ON M.店コード = S.店コード

わかりずらい質問ですがよろしくお願いします。

2つのテーブルから条件に一致しない行のみ抜き出しCSV
か他のテーブルに抜き出す処理を作ろうと思っています。

そこで質問なのですが、以下の2つのテーブルから
条件に一致しないコードのみ抜き出すSQL文などありますか?

-----------------------------------------
マスターテーブル
コード、ネーム1、ネーム2、店コード
1、あ、い、6
2、う、え、8
3、お、か、4
4、き、く、2


店コードテーブル
店コード、店区分
1、スーパー
2、コンビニ
3、デパート
4、ホームセンタ...続きを読む

Aベストアンサー

このような考え大丈夫でしょうか?
SELECT *
FROM マスターテーブル AS M INNER JOIN 店コードテーブル AS S
ON M.店コード = S.店コード

店コードが一致するレコードを抽出しているのですね。
はい、大丈夫です。
もっとも単純に、分かりやすい式を書くのであれば

この条件否定なので
left outer join で結合して、結合できなかったデータ、
つまり、店がNullのデータを取れば抽出できます。

SELECT *
FROM マスターテーブル AS M left outer join 店コードテーブル AS S
ON M.店コード = S.店コード
where S.店コード is null

または、
SELECT *
FROM マスターテーブル as M
where M.店コード not in ( select 店コード from 店コードテーブル)

等でいけるでしょう。

ただ、参考URLにもありますように、
is null とか not in は遅いです。(Indexで見れなくなるので)
大量データを扱うような場合や、速度が求められるような場合は
別途クエリを検討しましょう。

参考URL:http://www.geocities.jp/mickindex/database/db_optimize.html

このような考え大丈夫でしょうか?
SELECT *
FROM マスターテーブル AS M INNER JOIN 店コードテーブル AS S
ON M.店コード = S.店コード

店コードが一致するレコードを抽出しているのですね。
はい、大丈夫です。
もっとも単純に、分かりやすい式を書くのであれば

この条件否定なので
left outer join で結合して、結合できなかったデータ、
つまり、店がNullのデータを取れば抽出できます。

SELECT *
FROM マスターテーブル AS M left outer join 店コードテーブル AS S
ON M.店コード = S....続きを読む


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

人気Q&Aランキング