2016-11-28 2 views
0

У меня есть таблица контрактов с полями ContractTypeID, ContractID и ContractEndDate. Один ContractTypeID может иметь Multipe ContractIDs каждый со своим собственным ContractEndDate.SQL-тест на год дат в таблице

Для всех ContractTypeID, имеющих контракт с ContractEndDate в 2016 году, мне интересно увидеть SQL-запрос, который возвращает таблицу результатов с столбцом ContractTypeID и Result. Столбец результата следует читать соответственно:

  1. Если ContractTypeID имеет контракты, которые заканчиваются в 2016 году, 2017 году и 2018 года каждый возвратного «имеет контракт, который заканчивается в следующем году и год после того, как»

  2. Если ContractTypeID имеет контракты, которые заканчиваются в 2016 и 2017 только без контракта, заканчивающийся в 2018 году, читаем: «есть контракт , который заканчивается в следующем году»

  3. если ContractTypeID только имеет контракты , которые заканчиваются в 2016 году и никаких контрактов, которые заканчиваются в 2017 году 0r 2018 затем чтения «имеет контракт, который заканчивается в этом году»

Я приложил скриншоты для выборки данных и результата. Вы можете заметить в результате, ContractTypeID = 2 не отображается, поскольку у него нет контракта, который заканчивается в 2016 году и, следовательно, недействителен для этого теста.

Большое спасибо заранее

enter image description here

+0

Скриншот здесь: [ссылка] (https://i.stack.imgur.com/eoE8k.jpg) – sg91

+3

Привет Sg91. Добро пожаловать в Stack Overflow. Этот вопрос эффективно просит сообщество написать ваш запрос для вас. Вряд ли кто-нибудь сделает это бесплатно. Вместо этого попробуйте. Если вы застряли, разместите свой код. Опишите, как это произошло. Мы можем помочь вам исправить ситуацию. Здесь представлены большие ресурсы, из других мест на сайте, которые помогут вам при размещении вопроса: [один] (http://stackoverflow.com/help/how-to-ask), [два] (http: // meta .stackoverflow.com/questions/271055/tips-for-ask-a-good-structured-query-language-sql-question/271056) и [три] (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

Смежные вопросы