2016-11-28 4 views
0

フィールドContractTypeID、ContractIDおよびContractEndDateを持つContractテーブルがあります。 1つのContractTypeIDには、それぞれ独自のContractEndDateを持つ複数のContractIDがあります。テーブル内の日付の年のSQLテスト

2016年にContractEndDateとの契約を持つすべてのContractTypeIDについて、ContractTypeIDとResult列の結果テーブルを返すSQLクエリが必要です。結果の列がそれに応じてお読みください:

  1. をContractTypeIDは2016年、2017年と 2018各リターンで終わる契約を結んでいる場合は、

  2. 場合は「来年、年 後に終了契約を結んでいます」 ContractTypeIDは、唯一2018年に終わる契約なしで2016年に終わる契約や 2017を持ち、読みContractTypeIDのみの契約を持っている場合

  3. 「を来年終了契約 」を有している年のその終わりと2018その後、 読み取り0R 2017年に終了していない契約は、

私はサンプルデータと結果のためにスクリーンショットを添付している「今年を終了契約を結んでいる」。結果では、ContractTypeID = 2は2016年に終了する契約がないため表示されないため、このテストでは有効ではありません。事前に

感謝

enter image description here

+0

スクリーンショットはここにある:[リンク](https://i.stack.imgur.com/eoE8k.jpg) – sg91

+3

こんにちはSg91。スタックオーバーフローへようこそ。この質問は、コミュニティに質問を書くように効果的に求めています。誰もがこれを無料で行うことはほとんどありません。代わりに、行ってください。あなたのコードを投稿して立ち往生した場合。どのように/どこが間違っていたのかを記述してください。私たちはあなたが解決するのを助けることができここに質問を投稿するときに役立つ、サイトの他の場所からの素晴らしいリソースがあります:[1](http://stackoverflow.com/help/how-to-ask)、[two](http:// meta .stackoverflow.com/questions/271055/tips-for-asking-a-good-structured-query-language-sql-question/271056)および[three](http://stackoverflow.com/help/mcve)を参照してください。 –

答えて

0
それを解決するには、下の部分に問題をブレーク

: (私はこれがどのように機能するか見ることができるようにあなたはここで私はリストの各クエリを実行をお勧めします。)

関心

SELECT ContractID, 
    MAX(CASE WHEN YEAR(ContractEndDate) = 2016 THEN 1 ELSE 0 END) AS YEAR16, 
    MAX(CASE WHEN YEAR(ContractEndDate) = 2017 THEN 1 ELSE 0 END) AS YEAR17, 
    MAX(CASE WHEN YEAR(ContractEndDate) = 2018 THEN 1 ELSE 0 END) AS YEAR18 
FROM Contract 
GROUP BY ContractID 
の年間の旗を作ります

は、この結果にあなたのロジックを使用します。

SELECT ContractID, 
    CASE WHEN YEAR16 = 1 AND YEAR17 = 1 AND YEAR18 = 1 THEN 
    'Has a contract that ends next year and year after' 
    CASE WHEN YEAR16 = 1 AND YEAR17 = 1 THEN 
    'Has a contract that ends next year' 
    CASE WHEN YEAR16 = 1 THEN 
    'Has a contract that ends this year' 
    ELSE 'Something is wrong' 
END 
FROM (
    SELECT ContractID, 
    MAX(CASE WHEN YEAR(ContractEndDate) = 2016 THEN 1 ELSE 0 END) AS YEAR16, 
    MAX(CASE WHEN YEAR(ContractEndDate) = 2017 THEN 1 ELSE 0 END) AS YEAR17, 
    MAX(CASE WHEN YEAR(ContractEndDate) = 2018 THEN 1 ELSE 0 END) AS YEAR18 
    FROM Contract 
    GROUP BY ContractID 
) X 
+0

ありがとうございました - これは魅力的でした – sg91

0

あなたはあなたの答えをフォーマットし、ご契約日に算術演算を行うことを抽出するためにケースを使用することができます。あなたがこれまでに持っていたものを投稿して、私はあなたを助けてくれるでしょう!

+1

これは答えではありません、それはコメントです。 – Hogan

関連する問題