【大喜利】【投稿~9/18】 おとぎ話『桃太郎』の知られざるエピソード

下記のようなレコードを持つテーブル(仮に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を使う必要があるというぐらいしか分かっていません。
よろしくお願いします。

A 回答 (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
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
おお!まさに待ち望んでいたSQLです!
なるほどIIFを使えば、こんなに簡潔に書けるんですね。
自分ももっと勉強が必要だと痛感しました。
ありがとうございました!

お礼日時:2008/11/18 16:39

SELECT ID, Sum(price) AS SUM_Price


FROM Test1
・・・・

訂正: GROUP BY ID でしたので、これでOK!
    • good
    • 0

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
    • good
    • 0
この回答へのお礼

素早い回答ありがとうございます。
なるほど関数を作って処理を分ける方式ですね。
処理方式についてはじっくりと見て参考にさせて頂きますね。

ただ、、、できればSQL一発で何とかならないものでしょうか?

お礼日時:2008/11/18 16:08

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

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