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

以下のようなデータ件数のテーブルが、別々の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件)

テーブル2つ程度なら、これでもいいかと思います。


SELECT
(SELECT COUNT(*) FROM AA.TBL01) TBL01,
(SELECT COUNT(*) FROM BB.TBL02) TBL02
    • good
    • 9
この回答へのお礼

おお!これまた、すばらしい!
こんなに簡単に記述できるんですね。

ありがとうございました。

お礼日時:2008/10/08 18:56

可能です。


Union でつなげて、それぞれの結果を別の列にするのです。

SELECT COUNT(*) as F1, 0 As F2 FROM AA.TBL01
Union All
SELECT 0,COUNT(*) FROM BB.TBL02

後は結果をFrom句のテーブルとしてさらにSumします。
Select Sum(F1) , Sum(F2) From
(SELECT COUNT(*) as F1, 0 As F2 FROM AA.TBL01
Union All
SELECT 0,COUNT(*) FROM BB.TBL02
) T
    • good
    • 2
この回答へのお礼

おお!できるんですね。早速試してみます!

ありがとうございました。

お礼日時:2008/10/08 18:55

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

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

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

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

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

Q複数テーブルにわたるCOUNT

複数のテーブルで検索条件が当てはまった行を検索し、
その総行数を得たいのですが、
以下のSQL文ではあさっての数値が出てしまいます。
構文が間違っているのでしょうか。
(MySQLを使っています)

SELECT Count(*) FROM テーブル1,テーブル2,テーブル3
 WHERE (テーブル1.列1 Like 検索文字
     or テーブル2.列2 Like 検索文字
     or テーブル3.列2 Like 検索文字;

どなたか教えてください。よろしくお願いします。

Aベストアンサー

SELECT Count(*) FROM テーブル1,テーブル2,テーブル3
 WHERE (テーブル1.列1 Like 検索文字
     or テーブル2.列2 Like 検索文字
     or テーブル3.列2 Like 検索文字;

上記のSQLは、テーブル間の結合条件がない為、
結果、クロスジョインしてしまいます

〓例〓
テーブル1の総レコード数が5レコード
テーブル2の総レコード数が5レコード
テーブル3の総レコード数が5レコード
の条件で以下のSQLを実行した場合
5×5×5=125件が検索されます

SELECT A.A1,
    B.A1,
    C.A1
FROM
   テーブル1 AS A,
   テーブル2 AS B,
   テーブル3 AS C


単純に条件に該当するレコード件数を求めたい
場合は副問い合わせを利用します


副問い合わせはOLACLE・SQLSaver・ACCESSの機能として実装されていますが、MySqlに機能が実装されているかどうかは、知らないので、確認してみて下さい

ちなみに、副問い合わせの機能を利用して、レコード件数を調べたい場合は以下のようなSQLを作成します

SELECT
 (A.A_COUNT + B.B_COUNT + C.C_COUNT) AS SUM_COUNT
FROM
 (SELECT COUNT(*) AS A_COUNT
  FROM テーブル1
  WHERE 列名 Like '%文字列%') AS A,
 (SELECT COUNT(*) AS B_COUNT
  FROM テーブル2
  WHERE 列名 Like '%文字列%') AS B,
 (SELECT COUNT(*) AS C_COUNT
  FROM テーブル3
  WHERE 列名 Like '%文字列%') AS C

MySqlで副問い合わせが利用出来ない
場合は、仕方無いですが3回に分けて
結果を求めるしかないですね

目的によっては内部結合を利用して
出来るかも知れませんがMySqlで利用可能
かどうか知らないので、これも確認して下さい

SQLを基礎から覚えたい場合は
ACCESSのJet-Sqlから始める事をお勧めします
ACCESSのクエリという機能でビジュアル的に
SQLを表現してくれるので理解が早いと思いますよ。

SELECT Count(*) FROM テーブル1,テーブル2,テーブル3
 WHERE (テーブル1.列1 Like 検索文字
     or テーブル2.列2 Like 検索文字
     or テーブル3.列2 Like 検索文字;

上記のSQLは、テーブル間の結合条件がない為、
結果、クロスジョインしてしまいます

〓例〓
テーブル1の総レコード数が5レコード
テーブル2の総レコード数が5レコード
テーブル3の総レコード数が5レコード
の条件で以下のSQLを実行した場合
5×5×5=125件が検索されます

SELECT A.A1,
    B.A1,...続きを読む

Q複数のテーブルから値を合計出力するSQLについて

複数のテーブルから値を合計出力するSQLについて

以下の様な3つのテーブルがあり、それぞれのテーブルから値を合計した結果を取得したいと思っております。
この場合のSQL文をご教授いただけないでしょうか?
拙い説明でお分かりに難いかと思いますが、何卒、宜しくお願いします。

●テーブル

t1(テーブル1)
id, 会員ID, 日付, 金額

t2(テーブル2)
id, 会員ID, 日付, 金額

t3(テーブル3)
id, 会員ID, 日付, 金額


●期待する結果
上記、テーブル内の会員ID、日付が同じものの金額を合計して取得。(1行で出力)
いずれかのテーブルに「会員ID」が一つしか存在しない場合も、「日付」、「金額」を取得して「合計金額」に反映。
もし、各テーブル、レコードの「金額」が「0」または「null」の場合は「0」として処理する。


●期待出力結果イメージ

会員ID | 日付 | 合計金額 |
--------------------------------
m001 | 2011/07/20 | 1500 |
--------------------------------
m001 | 2011/06/10 | 2000 |
--------------------------------
m002 | 2011/06/05 | 1000 |
--------------------------------
m003 | 2011/05/25 | 0 |
--------------------------------
m001 | 2011/03/05 | 3000 |

※「合計金額」は、「t1(テーブル1)」~「t3(テーブル3)」の中に含まれていた金額の合計。

複数のテーブルから値を合計出力するSQLについて

以下の様な3つのテーブルがあり、それぞれのテーブルから値を合計した結果を取得したいと思っております。
この場合のSQL文をご教授いただけないでしょうか?
拙い説明でお分かりに難いかと思いますが、何卒、宜しくお願いします。

●テーブル

t1(テーブル1)
id, 会員ID, 日付, 金額

t2(テーブル2)
id, 会員ID, 日付, 金額

t3(テーブル3)
id, 会員ID, 日付, 金額


●期待する結果
上記、テーブル内の会員ID、日付が同じものの金額を合計して取得。(1行で出力...続きを読む

Aベストアンサー

UNIONでt1,t2,t3でテーブルを1個に結合して
Group ByすればOK?

「金額」が「0」または「null」の場合は「0」はNVLで対応


Select 会員ID, 日付, NVL(SUM(金額),0) AS 合計金額 From (
Select 会員ID, 日付, 金額 From t1
UNION ALL
Select 会員ID, 日付, 金額 From t2
UNION ALL
Select 会員ID, 日付, 金額 From t3
)
Group By 会員ID, 日付

QSELECT/別テーブルのレコード数も取得したい

■環境
・MySQL

■前提
・テーブルA … idカラム
・テーブルB … A_idカラム

■やりたいこと
・テーブルAデータを取得する際、テーブルAレコードに応じて、テーブルB「A_idカラム」の数(レコード数)も取得したい

■取得イメージ例
・テーブルA「全カラム」、「count」カラム
※「count」カラム … テーブルBにある「A_idカラム」の数

■知りたいこと
・どこにも存在しないこの「count」カラムはどうやって作成したら良いでしょうか?
・全体のSQL文

Aベストアンサー

私が思いついたのは、結合して GROUP BY を使う方法とSELECT句内のサブクエリを使う方法でした。
version 5.5.8 で確認しました。

■ 結合して GROUP BY を使う方法

SELECT a.id, COUNT(b.A_id) AS count
FROM table_a a
LEFT OUTER JOIN table_b b ON(a.id = b.A_id)
GROUP BY a.id;


■ SELECT句内のスカラサブクエリを使う方法

SELECT
id,
(SELECT COUNT(*) FROM table_b b WHERE a.id = b.A_id) AS count
FROM table_a a;

参考URL:http://gihyo.jp/dev/serial/01/sql_academy2/001003

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

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

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

と書くべきでしょうね。

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で違うテーブルの値を比較して値に差があるレコードを抽出したいのですがヒントをいただけないでしょうか。
下に例を作ってみました。(テキストに貼りなおしてもらうと見易くなると思います)
<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システムでも
使える可能性が高い)かと思います。

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文について(片方のテーブルに存在しないレコード抽出)

以下のような2つのテーブルがあったとして、
2つともに存在する「店コード」を抽出するのはSQLは分かるのですが、
片方に存在しない「店コード」(以下の例の場合、「2」)を抽出するSQLを
一文で書くにはどうすればいいのでしょうか?

<店テーブル>
店コード住所・・・(その他、基本情報)
1aaa
2bbb
3ccc

<販売テーブル>
店コード販売品目・・・(その他、販売数など)
1xxx
3zzz

Aベストアンサー

オプティマイザ次第だけど、NOT-INは、あまりお勧めでない。
外部結合も索引があっても有効に使われないので、お勧めでない。

select * from A where not exists(select 1 from B where A.店コード=B.店コード);


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

人気Q&Aランキング