下記のようなレコードを持つテーブル(仮にtest1)があります。
ID price type
001 2000 1
001 4000 1
002 8000 2
003 2000 1
003 8000 2
004 5000 3
ここから次の条件で抽出したいのですがSQLに明るくないためよくわかりません。
・typeが1と2の両方を持つもの、または、3を持つものを除く
・その上でpriceの合計値をIDごとに得たい
求める結果としては、
ID price
001 6000
002 8000
を得たいのですが。
distinctを使う必要があるというぐらいしか分かっていません。
よろしくお願いします。
No.3ベストアンサー
- 回答日時:
別解です。
IIFをCASE式などに書き換えれば、Access以外でも同様に書けます。SELECT ID,SUM(Price)
FROM test1
GROUP BY ID
HAVING NOT (SUM(IIF(Type=1,1,0))>0 AND SUM(IIF(Type=2,1,0))>0) AND SUM(IIF(Type=3,1,0))=0
回答ありがとうございます。
おお!まさに待ち望んでいたSQLです!
なるほどIIFを使えば、こんなに簡潔に書けるんですね。
自分ももっと勉強が必要だと痛感しました。
ありがとうございました!
No.1
- 回答日時:
SUM_ID_SUM_Price
________1______\6,000
________2______\8,000
SELECT
MAX(ID) AS SUM_ID, Sum(price) AS SUM_Price
FROM Test1
WHERE
Not (DBCount("*","test1","type=1 AND ID=" & id,0) And DBCount("*","test1","type=2 AND ID=" & id,0))
And DBCount("*","test1","type=3 AND ID=" & id,0)=0
GROUP BY ID;
かなり、邪道なやり方の回答です。
正規のSQL文を考えるのが苦手な私です。
ですから、抽出条件をそのまんま書きました。
Public Function DBCount(ByVal strField As String, _
ByVal strTable As String, _
Optional ByVal strWhere As String = "", _
Optional ByVal ReturnValue = 0) As Variant
On Error GoTo Err_DBCount
Dim N
Dim strQuerySQL As String
Dim rst As ADODB.Recordset
Set rst = New ADODB.Recordset
strQuerySQL = "SELECT COUNT(" & strField & ") FROM " & strTable
If Len(strWhere) > 0 Then
strQuerySQL = strQuerySQL & " WHERE " & strWhere
End If
With rst
.Open strQuerySQL, _
CurrentProject.Connection, _
adOpenStatic, _
adLockReadOnly
If Not .BOF Then
.MoveFirst
N = .Fields(0)
End If
End With
Exit_DBCount:
On Error Resume Next
rst.Close
Set rst = Nothing
DBCount = IIf(N <> 0, N, ReturnValue)
Exit Function
Err_DBCount:
MsgBox "SELECT 文の実行時にエラーが発生しました。(DBCount)" & Chr$(13) & Chr$(13) & _
"・Err.Description=" & Err.Description & Chr$(13) & _
"・SQL Text=" & strQuerySQL, _
vbExclamation, " 関数エラーメッセージ"
Resume Exit_DBCount
End Function
素早い回答ありがとうございます。
なるほど関数を作って処理を分ける方式ですね。
処理方式についてはじっくりと見て参考にさせて頂きますね。
ただ、、、できればSQL一発で何とかならないものでしょうか?
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・人生のプチ美学を教えてください!!
- ・10秒目をつむったら…
- ・あなたの習慣について教えてください!!
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・【大喜利】【投稿~9/18】 おとぎ話『桃太郎』の知られざるエピソード
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
エクセルで最後の文字だけ置き...
-
エクセルの関数について教えて...
-
副問合せの書き方について
-
エラー 1068 (42000): 複数の主...
-
DB設計について
-
Updateの複数テーブル条件時のL...
-
WHERE id = ? について
-
MySQLのint型で001と表示する方...
-
NOT INをNOT EXISTSで書き直したい
-
VIEWの元のテーブルのindexって...
-
SQLサーバから、項目の属性(型...
-
SQL Left Join で重複を排除す...
-
SQLにて特定の文字を除いた検索...
-
LEFT JOIN と GROUP BY
-
複数JOINしているとCOUNTが正し...
-
一つ前のレコードの値と減算し...
-
SQLで重複値を除去したものを抽...
-
Mysqlでunionを使った検索速度...
-
accessのチェックボックスをSQL...
-
順位の取得
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
エクセルで最後の文字だけ置き...
-
エクセルの関数について教えて...
-
VIEWの元のテーブルのindexって...
-
副問合せの書き方について
-
select文のwhere句に配列を入れ...
-
マイクラPC版のコマンドで効率...
-
SQLサーバから、項目の属性(型...
-
エラー 1068 (42000): 複数の主...
-
[MySQL] 3つのテーブルの結合で...
-
Access パラメータクエリをcsv...
-
SQLにて特定の文字を除いた検索...
-
SQL Left Join で重複を排除す...
-
ストアドのエラーについて
-
Unionした最後にGROUP BYを追加...
-
バインド変数について
-
PL/SQLの変数について
-
sqlで、600行あるテーブルを100...
-
WordpressのContact form 7でzi...
-
selectした大量データをinsert...
-
inner joinをすると数がおかし...
おすすめ情報