2016-02-29 4 views
2

У меня возникла проблема с попыткой написать некоторый SQL для MS Access, который будет анализировать некоторые данные так, как я надеялся. Хотя я, по общему признанию, новичок (или все еще учился за пределами класса колледжа, который я взял пять лет назад) в отношении SQL, я бы хотел подумать, что я могу сделать.Access SQL Conditional Clause Несколько условий/записей в одном столбце

Сценарий: Хотя я, возможно, не начинал все это эффективно для начала, я начал с двух таблиц. Первоначальный набор данных начинался с чуть менее 72 тыс. Записей.

Цель, или то, что я пытался выполнить в случае, заключалась в том, чтобы найти все записи, в которых кто-то появлялся более чем на один заряд, а результат за заряд, который определяется как имеющий 0 очков, виновен, однако другие заряды обнаруживаются либо НГ, либо Уволены.

Вот что у меня есть. Эти данные я начал с двух таблиц, в которых содержались видимости, в которых были коды и точки.

Пример для выступлений будет похоже на следующее:

APP DATE  CHARGE OUTCOME 
=================================== 
1  1/1/2014 137  GT   
2  1/5/2014 122  GT   
2  1/5/2014 123  DI  
3  1/6/2014 257  DI 
3  1/6/2014 257  DI 
4  1/6/2014 137  NG 
4  1/6/2014 123  DI 
4  1/6/2014 122  GT 

я имел вторую таблицу, которая связана с зарядом, на потенциальное количество точек, связанных с зарядом, достаточно простого форматирования там

CHARGE POINT 
=============== 
122  0 
123  2 
137  2 
257  0 

Таким образом, я создал несколько базовых запросов, так как я в основном заполняю пробелы на основе массива файлов данных, которые были предоставлены мне. Первый один вытащил присоединился первые две таблицы вместе, так что я остался с таблицей, смотрел что-то вдоль линий:

APP DATE  CHARGE OUTCOME POINTS 
========================================== 
1  1/1/2014 137  GT  2  
2  1/5/2014 122  GT  0 
2  1/5/2014 123  DI  2 
3  1/6/2014 257  DI  0 
3  1/6/2014 257  DI  0 
4  1/6/2014 137  NG  2 
4  1/6/2014 123  DI  2 
4  1/6/2014 122  GT  0 

Затем я создал три небольших запросов, которые были каждый попросили произвести подмножество данных из основной запрос, один для OUTCOME = GT, Points = 0, другой для Outcome = NG, Points> 2, последний Outcome = DI, Points> 2. Каждый из запросов был вызван в запросе make-таблицы, который привел запись, установленную с исходного 72k до 39k. Применяя еще один запрос с

Select * from record_set Where RecordID IN 
(Select RecordID from record_Set 
GROUP BY RecordID 
HAVING COUNT (*) > 1)) 

на конце принесли общее количество всего до 21k.

Моя проблема заключается в следующем: Набор данных, который я хотел бы вернуть, должен дополнительно фильтровать результаты. В настоящее время я не понял, как отсеять значения APP, где оба значения равны 0. Для всех, кого я знаю, я должен был подойти к этому совершенно по-другому.

EDIT: То, что я искал бы это набор данных, который возвращается выглядеть примерно так:

APP DATE  CHARGE OUTCOME POINTS 
==========================================  
2  1/5/2014 122  GT  0 
2  1/5/2014 123  DI  2 
4  1/6/2014 137  NG  2 
4  1/6/2014 123  DI  2 
4  1/6/2014 122  GT  0 

Если одна запись вытянутую и APP, где РЕЗУЛЬТАТ был DI/0 для всех связанные с этим расходы.

Текущие попытки, которые я попытался использовать прямое предложение WHERE, оценивают только одно значение записи. Наверное, я ищу способ оценить и то, и другое. Может быть, было бы проще, если бы я написал значение для разделения временных таблиц, а затем сделал объединение только для значений APP, появившихся в обеих таблицах?

Любая помощь или руководство будет принята с благодарностью!

ответ

0

Мой опыт работы с MS-Access довольно близок к нулю, но я считаю, что этот синтаксис будет работать. По крайней мере, это может вызвать некоторые идеи.

SELECT APP, DATE, CHARGE, OUTCOME, POINTS 
FROM APP A 
INNER JOIN CHARGE C on C.Charge = A.Charge 
WHERE (Outcome = 'GT' and Points = '0') 
OR (Outcome = 'NG' and Points > '2') 
OR (Outcome = 'DI' and Points > '2') 

Я не уверен, что вы имеете в виду случаи, когда оба значения равны 0, но более чем вероятно, вы можете добавить еще один пункт WHERE отфильтровать тех, как хорошо.

EDIT:

Я думаю, набор данных, я ищу всегда будет иметь следующее: Более чем одно приложение, в то время как содержащий одну запись с 0 PTS, который был GT, и один (или более записи), которое может быть значением точки больше 0 , которое является либо DI, либо NG. Поэтому я начал на 2, что я знаю нет никаких значений, которые содержат 1, но я предполагаю, чтобы быть тщательно они могут быть включены

Первых Служб, которые соответствуют 0 PT и GT требования :

SELECT APP 
FROM APP A 
INNER JOIN CHARGE C on C.Charge = A.Charge 
WHERE Outcome = 'GT' 
AND Points = '0' 

Повторное использование выше, чтобы получить приложения, которые значения точек больше 0 и DI или НГ:

SELECT APP 
FROM APP A 
INNER JOIN CHARGE C on C.Charge = A.Charge 
WHERE (Outcome = 'DI' AND Points > '0') 
OR (Outcome = 'NG' AND Points > '0') 

Далее, объединить выше логики в один запрос, используя два subquer х годов для того, чтобы только тянуть данные APP, который отвечает обоим требованиям:

SELECT APP, DATE, A.CHARGE, OUTCOME, POINTS 
FROM APP A 
INNER JOIN CHARGE C on C.Charge = A.Charge 
WHERE APP IN (
    SELECT APP 
    FROM APP A 
    INNER JOIN CHARGE C on C.Charge = A.Charge 
    WHERE Outcome = 'GT' 
    AND Points = '0' 
) 
AND APP IN (
    SELECT APP 
    FROM APP A 
    INNER JOIN CHARGE C on C.Charge = A.Charge 
    WHERE (Outcome = 'NG' AND Points > '0') 
    OR (Outcome = 'DI' AND Points > '0') 
) 

Это приведет только АРР, которые имеют GT, 0 PT заряд, а другой заряд, DI или NG с 1 или более КОЗ.

+0

Простите, я очистил свой вопрос, чтобы быть немного яснее. То, что я пытаюсь сделать, - это отсеять все случаи, когда говорят, что запись содержит значения точек, которые были только 0. Поэтому, если у кого-то было 5 записей, мне нужно иметь возможность сравнивать их с собой. – dramerus

+0

Единственная мысль, которую мне пришлось решить до сих пор, заключалась в следующем: отделите комбинации зарядов/приложений, которые имеют точки от тех, которые этого не делают. Создайте список только применимого APP, а затем сравните его между двумя таблицами. Если кто-то не появится в обоих, то он не будет включен ... может быть? мысли? – dramerus

+0

Я все еще немного смущен - тестирование моего предложения с помощью вашей логики оставит вас с запрошенным вами результатом. http://sqlfiddle.com/#!9/97c0c/3 –

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