2012-01-22 11 views
1

テーブルがあります。それは、これらの列を持っている、のは言わせて:あなたは、いくつかの行はどちらもOpeningBalanceClosingBalance列の値を持っていないことに気づくでしょう現在の行の次の空白行まで空白の行の照会の合計

OpeningBalance ClosingBalance SomeOtherValueIDontCareAbout 
-------------- -------------- ----------------------------- 
22     100    Foo 
16     84    Bar 
            Har 
            Tar 
            Zar 
            Bar 
            Foo Bar 
12     16    Har 
            Par 
91     126    Zoogle 
            Proper 
            Hello 
21     182    Sing 
------------------------------------------------------------------- 

常に、ClosingBalanceOpeningBalanceより大きい。

行の残高(ClosingBalance- OpeningBalance)の増加を計算します。次に、値がある行まで、その行の下の行のどれかが空白の値を持つかを数えます。ClosingBalance次に、以下のような要約を表示します。

Group    IncreaseInBalance  TotalRowsItAppliesTo 
------------  ------------------  --------------------- 
Group1    78      1 
Group2    68      6 
Group3    4      2 
Group4    35      3 
Group5    161      1 
-------------------------------------------------------------------- 

これは、私たちが扱っているMS Accessデータベースです。私は完全に失われています。私は何らかの方法でSQLに触れていない、形や形をしている間はしばらくしています。

助けてください。コメントの

UPDATE

感謝。私は私の親しい友人からこの問題を得ました。私も彼もデータの編成に関して何の支配もしていません。選択肢がなければ、私は最初からポスターを1つ作成して2つのテーブルを作成してデータベースを設計しました。

これを踏まえると、私はデータをよく見ていました。

データは、2つの列でソートされます。まず、Locationという文字列値と、次にRecordingDateというDateTime値がソートされます。

ただし、これらの2つの列のどちらも、空白の行には関係しない可能性があります。 inと同様に、約200行が1つの場所と1つの日付に属し、別の100行ほどが同じ場所の別の日付に属し、別の場所に別の200行が別の日付で格納されます。ただし、最初の行の後にも空白の行がたくさんあります。

私が言っていることを得ることを望みます。

したがって、ORDER BYには、空白の行セットをカウントするためにLocationまたはRecordingDateでそれを行うのは間違いだと思います。

Jetデータベースには## rowIdのようなものはありませんか?私は、この作業を行っている組織は、行がデータベースに入力された順序と見なされることを想定していると思います。

出口がありますか?

+0

SQLはセットベースの言語ですか?明示的にソートされていない限り、 "order"という概念はありません。可能な限り、すべてのタプル(行)に対してOpeningBalanceとEndingBalanceを明示的に挿入する必要があります。 – voithos

+0

@voithosによると、これは順序付けられたシーケンスに依存しますが、SQLでは、注文できる列がある場合にのみ順序が保証されます。 ORDER BYでサンプルデータを注文するために使用できるデータセット内の列はありますか? – MatBailie

+0

これらのデータを格納するテーブルは、バランス値(ギャップなし!)とキー列を含むテーブルと、SomeOtherValueIDontCareAboutを持つ行と、2つのテーブルをリンクさせる参照カラム適切な方法で。その後、増加を計算し、関連する行を数えることは、単なる参加、グループ化および集約の問題に過ぎない。 –

答えて

2

SQLは行の順序を認識していないので、SQLだけでは解決できません。 SQLはテーブルを数学的なセットとして扱います。

まず、テーブルにLong Integerとして "Group"という名前の新しい列を追加します。このコードを実行してテーブルを準備する

Public Sub PrepareBalance() 
    Dim db As DAO.Database, rs As DAO.Recordset 
    Dim group As Long 

    Set db = CurrentDb 
    Set rs = db.OpenRecordset("tblBalance") 
    Do Until rs.EOF 
     If Not IsNull(rs!OpeningBalance) Then 
      group = group + 1 
     End If 
     If rs!group <> group Then 
      rs.Edit 
      rs!group = group 
      rs.Update 
     End If 
     rs.MoveNext 
    Loop 
    rs.Close 
    db.Close 
End Sub 

これは、各行にグループ番号を追加します。今すぐこのクエリを実行できます

SELECT 
    tblBalance.Group, 
    Max([ClosingBalance]-[OpeningBalance]) AS IncreaseInBalance, 
    Count(*) AS TotalRowsItAppliesTo 
FROM 
    tblBalance 
GROUP BY 
    tblBalance.Group; 
+0

ああ!そうですか。したがって、基本的には、コードを使用して、グループ化する新しい列を追加します。ええ、私はそれをすることができます。私は私の友人に知らせるでしょう。ソリューションに感謝します。 :-) –