2017-02-12 14 views
0

2つの異なる年(2016 & 2017)の複数のエントリがある場合、Access DBにどのように問い合わせることができますか?それは2016 & 2017年にすべてのヘルプを発生するので2年間を選択するMS AccessのSQLクエリ

[Value] [Date] 
1234 1/1/16 
1234 1/1/17 
4321 1/1/16 
4321 1/1/16 
4321 2/2/16 

1234「真」になります:

SELECT DNum 
FROM tblNum 
WHERE (DNum='0000' AND YEAR(DDate)=2016) OR YEAR(DDate)=2017) 

サンプルDB - 私はその正確ではありませんが、/ ANDが、「通常の」クエリを使用してみています感謝されます。ありがとう。

歓声、

答えて

1

これは、MS Accessでややこしいことがあります。ここでは2年間の作品の一つの方法は次のとおりです。

SELECT DNum 
FROM tblNum 
WHERE YEAR(DDate) IN (2016, 2017) 
GROUP BY DNum 
HAVING MIN(YEAR(DDATE)) = 2016 AND MAX(YEAR(DDate)) = 2017; 

あなたが年の任意の数を持っていた場合、あなたはより複雑なHAVING句でこれを行うことができます:WHEREではないこと

SELECT DNum 
FROM tblNum 
WHERE YEAR(DDate) IN (2015, 2016, 2017) 
GROUP BY DNum 
HAVING SUM(IIF(YEAR(DDATE) = 2015, 1, 0) > 0 AND 
     SUM(IIF(YEAR(DDATE) = 2016, 1, 0) > 0 AND 
     SUM(IIF(YEAR(DDATE) = 2017, 1, 0) > 0; 

は注意このクエリでは厳密に必要です。これにより、集計されるデータの量が削減され、パフォーマンスが向上する可能性があります。

+0

こんにちは、私はあなたの最初の例を試してみて、それが完璧に動作します。 SUM/IIFを使用した2番目のより進んだ例についていくつかの調査を行います。どうもありがとう! – aboka

0

あなたは、このクエリを使用することができます。

SELECT a.DNum, a.DDate 
FROM tblNum a INNER JOIN tblNum b 
    ON a.DNum = b.DNum AND 
    YEAR(a.DDate) <> YEAR(b.DDate) 

あなたは次のようにフィルタリングすることができます:

SELECT a.DNum, a.DDate 
FROM tblNum a INNER JOIN tblNum b 
    ON a.DNum = b.DNum AND 
    YEAR(a.DDate) <> YEAR(b.DDate) 
WHERE YEAR(a.DDate) in (2016,2017) 

結果:

DNum DDate 
1234 2016/01/01 
1234 2017/01/17 

をあなたはDISTINCTキーワードにDDate使用を必要としない場合DNumの繰り返しを避ける:

SELECT DISTINCT a.DNum 
FROM tblNum a INNER JOIN tblNum b 
    ON a.DNum = b.DNum AND 
    YEAR(a.DDate) <> YEAR(b.DDate) 
WHERE YEAR(a.DDate) in (2016,2017) 

結果:

DNum 
1234 
+0

別のオプションありがとう:) – aboka

関連する問題