0

確かにそこにあるので質問するのは躊躇しますが、答えを見つけるためのキーワードを思い付くことができないようです。サブクエリ(通常はAccessユーザー)から始めて、境界の外に出ています。

TECH_ID、、SEQ_NBRおよびを含むクエリがありますPELL_FT_AWD_AMT

SELECT ISRS_V_NEED_ANAL_RESULT_PARENT.TECH_ID, ISRS_V_NEED_ANAL_RESULT_PARENT.AWD_YR, ISRS_V_NEED_ANAL_RESULT_PARENT.PELL_FT_AWD_AMT, ISRS_V_NEED_ANAL_RESULT_PARENT.SEQ_NBR
FROM ISRS_V_NEED_ANAL_RESULT_PARENT
GROUP BY ISRS_V_NEED_ANAL_RESULT_PARENT.TECH_ID, ISRS_V_NEED_ANAL_RESULT_PARENT.AWD_YR, ISRS_V_NEED_ANAL_RESULT_PARENT.PELL_FT_AWD_AMT, ISRS_V_NEED_ANAL_RESULT_PARENT.SEQ_NBR
HAVING (((ISRS_V_NEED_ANAL_RESULT_PARENT.AWD_YR)="2013"))
ORDER BY ISRS_V_NEED_ANAL_RESULT_PARENT.TECH_ID;

返したいのはSEQ_NUM、各レコードの最大値のみを選択するサブクエリを追加することですが、構文が正しくないようです。以前は、チートして、最初にTECH_IDとmaxを取得する別のクエリSEQ_NUMを作成し、次に元のテーブルを使用する2番目のクエリと、結合内の最初のクエリを使用して残りを取得していました。

1つのクエリでこれを行うにはどうすればよいですか?

例:

TECH_ID    SEQ_NUM    PELL
1          1          4000
1          2          4000
1          3          5000

シーケンス番号の最大値だけを使用しても、次の結果が返されます1; 2; 40001; 3; 5000後者のみが必要な場合。

4

3 に答える 3

4

私があなたが求めているものを誤解しているなら私を許してください、しかしこれがあなたが必要とするすべてであるように思われます:

SELECT ISRS_V_NEED_ANAL_RESULT_PARENT.TECH_ID, ISRS_V_NEED_ANAL_RESULT_PARENT.AWD_YR, ISRS_V_NEED_ANAL_RESULT_PARENT.PELL_FT_AWD_AMT, MAX(ISRS_V_NEED_ANAL_RESULT_PARENT.SEQ_NBR)
FROM ISRS_V_NEED_ANAL_RESULT_PARENT
GROUP BY ISRS_V_NEED_ANAL_RESULT_PARENT.TECH_ID, ISRS_V_NEED_ANAL_RESULT_PARENT.AWD_YR, ISRS_V_NEED_ANAL_RESULT_PARENT.PELL_FT_AWD_AMT
HAVING (((ISRS_V_NEED_ANAL_RESULT_PARENT.AWD_YR)="2013"))
ORDER BY ISRS_V_NEED_ANAL_RESULT_PARENT.TECH_ID;

元のクエリから行った2つの変更は、句に追加することと、MAX()句から削除することです。SEQ_NBRSELECTSEQ_NBRGROUP BY

関連性のないメモとして、テーブルエイリアスを使用すると、クエリを短くして読みやすくすることができます。例えば:

SELECT p.TECH_ID, p.AWD_YR, p.PELL_FT_AWD_AMT, MAX(p.SEQ_NBR)
FROM ISRS_V_NEED_ANAL_RESULT_PARENT p
GROUP BY p.TECH_ID, p.AWD_YR, p.PELL_FT_AWD_AMT
HAVING (((p.AWD_YR)="2013"))
ORDER BY p.TECH_ID;

編集: @Slippery Peteは、あなたのHAVING条項が無効であるという非常に良いキャッチをしました。一般に、結果を詳細なレベルでフィルタリングする場合はWHERE、;を使用します。集計情報に基づいて結果をフィルタリングする場合は、を使用しますHAVING。この場合、が必要ですWHERE

SELECT p.TECH_ID, p.AWD_YR, p.PELL_FT_AWD_AMT, MAX(p.SEQ_NBR)
FROM ISRS_V_NEED_ANAL_RESULT_PARENT p
WHERE  p.AWD_YR = "2013"
GROUP BY p.TECH_ID, p.AWD_YR, p.PELL_FT_AWD_AMT
ORDER BY p.TECH_ID;

Edit2:PELL異なることと、あたりのシーケンス番号が最も高い行のみが必要であることについて、以下のコメントを読みましたTECH_ID。あなたは実際にはかなり複雑な質問をしているので、かなり複雑な答えが必要になります。MS Accessがこれらのタイプのネストされたクエリをサポートしているかどうかはわかりませんが、必要なものを取得するために考えられるSQLクエリの1つを次に示します。

SELECT p.TECH_ID, p.AWD_YR, p.PELL_FT_AWD_AMT, p.SEQ_NBR
FROM ISRS_V_NEED_ANAL_RESULT_PARENT p
JOIN (
    SELECT TECH_ID, MAX(SEQ_NBR) AS 'SEQ_NBR'
    FROM ISRS_V_NEED_ANAL_RESULT_PARENT
    GROUP BY TECH_ID
) AS m ON p.TECH_ID = m.TECH_ID AND p.SEQ_NBR = m.SEQ_NBR
WHERE p.AWD_YR = "2013"
ORDER BY p.TECH_ID;
于 2012-10-11T21:08:30.703 に答える
1

そのhaving条項は私にとってもうまくいきませんでした。私はこれを思いついた:

SELECT ISRS_V_NEED_ANAL_RESULT_PARENT.TECH_ID, ISRS_V_NEED_ANAL_RESULT_PARENT.AWD_YR, ISRS_V_NEED_ANAL_RESULT_PARENT.PELL_FT_AWD_AMT, max(ISRS_V_NEED_ANAL_RESULT_PARENT.SEQ_NBR) as MAX_SEQ_NBR
FROM ISRS_V_NEED_ANAL_RESULT_PARENT
WHERE ISRS_V_NEED_ANAL_RESULT_PARENT.AWD_YR = '2013'
GROUP BY ISRS_V_NEED_ANAL_RESULT_PARENT.TECH_ID, ISRS_V_NEED_ANAL_RESULT_PARENT.AWD_YR, ISRS_V_NEED_ANAL_RESULT_PARENT.PELL_FT_AWD_AMT
ORDER BY ISRS_V_NEED_ANAL_RESULT_PARENT.TECH_ID;
于 2012-10-11T21:11:59.797 に答える
1

次のような相関サブクエリを探していると思います。

SELECT p.TECH_ID, p.AWD_YR, p.PELL_FT_AWD_AMT, MAX(p.SEQ_NBR), (SELECT MAX(SEQ_NBR) FROM ISRS_V_NEED_ANAL_RESULT_PARENT p2 
 WHERE p2.TECH_ID=p.TECH_ID AND p2.AWD_YR = 2013) AS MAX_SEQNBR
FROM ISRS_V_NEED_ANAL_RESULT_PARENT p
WHERE  p.AWD_YR = 2013
GROUP BY p.TECH_ID, p.AWD_YR, p.PELL_FT_AWD_AMT
ORDER BY p.TECH_ID

Here's an SQL Fiddle example: http://sqlfiddle.com/#!3/ae484/7
于 2012-10-11T23:30:03.380 に答える