アプリ版:「スタンプのみでお礼する」機能のリリースについて

SQL分の記述で質問なんですが、

データベース上に日付、時間、フラグと言う項目があります。
同一の日付、時間のものは数件ずつあります。
フラグは"b"と"1"があります。
このデータの日付・時間辺りの件数と+フラグが"1"の件数を同時に取得するSQL分はかけますでしょうか?

別々ならば、
SELECT DATE,TIME,COUNT(*) AS KENSU1
FROM W_TABLE
GROUP BY DATE,TIME
ORDER BY DATE,TIME



SELECT DATE,TIME,COUNT(*) AS KENSU2
FROM W_TABLE
WHERE FLG="1"
GROUP BY DATE,TIME
ORDER BY DATE,TIME

でかけると思うのですが、
1個のSQL分で記述は可能でしょうか?

処理結果を
05/02/23 12:00 10 5
05/02/24 10:00 12 3
(日付・時間・件数・フラグ="1"の件数

 見たいに取得したいのですが..

A 回答 (3件)

Oracleのバージョンにより異なりますが


Case When の記述かDecode関数を使用すれば可能だと思われます。

SELECT DATE, TIME, COUNT(*) AS KENSU1, SUM(CASE WHEN FLG = "1" THEN 1 ELSE 0 END) AS KENSU2
FROM W_TABLE
GROUP BY DATE,TIME
ORDER BY DATE,TIME

もしくは

SELECT DATE, TIME, COUNT(*) AS KENSU1, SUM(DECODE(FLG, "1", 1, 0)) AS KENSU2
FROM W_TABLE
GROUP BY DATE,TIME
ORDER BY DATE,TIME

のSQLでお望みの結果が得られませんでしょうか?

CASE WHEN FLG = "1" THEN 1 ELSE 0 END
または
DECODE(FLG, "1", 1, 0)
の記述は、FLG = "1"であった場合は 1 を、そうでなければ 0 を返します。
これをSUMで集計する事により、FLG="1"であるレコードの件数が得られる形になります。

SQLServerで動作確認はしましたが、Oracleでの確認は取れていませんので悪しからず。
    • good
    • 0
この回答へのお礼

decode関数は知りませんでした。
勉強になりました。

お礼日時:2005/02/26 03:02

以下のようなSQLでは如何でしょうか



SELECT DATE,TIME,SUM(KENSU1),SUM(KENSU2)
FROM
(SELECT DATE,TIME,COUNT(*) KENSU1,0 KENSU2
FROM W_TABLE
GROUP BY DATE,TIME
UNION ALL
SELECT DATE,TIME,0 KENSU1,COUNT(*) KENSU2
FROM W_TABLE
WHERE FLG = '1'
GROUP BY DATE,TIME)
GROUP BY DATE,TIME
    • good
    • 0
この回答へのお礼

ご回答ありがとうございました。
正直もう少し簡単に書けると思いましたが...
試して見たいと思います。

お礼日時:2005/02/26 03:04

WHERE FLG="1"の無いクエリ(全件件数クエリ)とWHERE FLG="1"のあるクエリ(条件件数クエリ)を2つ作成して下さい。



そうすると、
05/02/23 12:00 10
05/02/24 10:00 12
と言う結果が得られるクエリと、
05/02/23 12:00 5
05/02/24 10:00 3
と言う結果が得られるクエリになります。

それら2つのクエリを結合するクエリを作成して、DATEとTIMEで結合させます。

SELECT Q1.DATE,Q1.TIME,Q1.KENSU1,Q2.KENSU2
FROM Q1 INNER JOIN Q2 ON ((Q1.DATE = Q2.DATE) AND (Q1.TIME = Q2.TIME))

完全に1つのSQL文で書くのは難しいと思います。
    • good
    • 0
この回答へのお礼

ありがとうございました。
2つのクエリを結合するのは思いつきませんでした。

お礼日時:2005/02/26 03:01

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