1

一意の識別子ごとに複数の日付エントリを持つ Access テーブルがあります

Year      ID  TotalSpent
2003-2004 001 1000
2002-2003 001  900
2001-2002 001  100
2009-2010 002 8000
2008-2009 002 4000
2000-2001 003  100
1999-2000 003    0

作成する一意の ID ごとに最新 (トップ) のエントリを保持したい

Year      ID  TotalSpent
2003-2004 001 1000
2009-2010 002 8000
2000-2001 003  100

top() 関数を見てきましたが、(一意の ID ごとに 1 つの結果ではなく) 複数の結果を生成することはできません。どんな助けでも大歓迎です。

4

2 に答える 2

1

Remou は、一意の ID が将来的に一番上の行を参照できるようになるため有益であるという有効な指摘をしていますが、これは制御できない制約になる可能性があります。

データ ソースは、ハイフンでつながれた年で少しぎこちなく、単純なグループ化クエリを妨げています。TotalSpent2 番目の問題は、最後のフィールドではない可能性があるため、フィールドの最大数だけでグループ化することはできないということです(たとえば、多額の払い戻しは年間の合計に影響を与える可能性があります)。

私の解決策は、各 ID (クエリ A) の最新の年を見つけてから、年タグを改良してテーブル B に結合することです。計算フィールドで結合を実行したくなかったので、別のサブクエリでラップしました (クエリB)。次に、これを元のテーブル/クエリに結合して、キーの行と値を抽出します。

SELECT YourTable.[YourYearField],
   YourTable.ID,
   YourTable.TotalSpent
FROM   (SELECT A.ID,
           [StartYear] & "-" & [EndYear] AS Grouping
    FROM   (SELECT YourTable.ID,
                   Max(Val(Right$([YourYearField], 4)))     AS EndYear,
                   Max(Val(Right$([YourYearField], 4)) - 1) AS StartYear
            FROM   YourTable
            GROUP  BY YourTable.ID) AS A
    GROUP  BY A.ID,
              [StartYear] & "-" & [EndYear]) AS B
   INNER JOIN YourTable
           ON ( B.Grouping = YourTable.[YourYearField] )
              AND ( B.ID = YourTable.ID )
GROUP  BY YourTable.[YourYearField],
      YourTable.ID,
      YourTable.TotalSpent; 
于 2013-01-10T23:09:39.427 に答える
0

Yearこのクエリを使用して、必要な値と値を取得できIDます。

SELECT ID, Max([Year]) AS MaxOfYear
FROM YourTable
GROUP BY ID;

次に、対応するTotalSpent値を取得するには、結合するサブクエリにその SQL を使用しますYourTable

SELECT y.Year, y.ID, y.TotalSpent
FROM
    YourTable AS y
    INNER JOIN
        (
            SELECT ID, Max([Year]) AS MaxOfYear
            FROM YourTable
            GROUP BY ID
        ) AS sub
    ON
            (y.Year = sub.MaxOfYear)
        AND (y.ID = sub.ID);
于 2013-01-10T22:49:32.343 に答える