Таблица запросов MS Access без первичного ключа

Вопрос:
Claim# Total ValuationDt
1     100     1/1/12
2     550     1/1/12
1     2000    3/1/12
2     100     4/1/12
1     2100    8/1/12
3     200     8/1/12
3     250     11/1/12

Используя MS Access, мне нужен запрос, который возвращает только те претензии, которые были оценены более чем на 500 долларов в какой-то момент в течение срока службы претензий. В этом примере запрос должен вернуться

Claim# Total ValuationDt
1     100     1/1/12
2     550     1/1/12
1     2000    3/1/12
2     100     4/1/12
1     2100    8/1/12

потому что требование № 1 было оценено более чем на 500 долл. США по состоянию на 3/1/12, 2-я претензия была оценена более чем на 500 долл. США на 1/1/12, а требование № 3 никогда не оценивалось более чем на 500 долл. США.

Лучший ответ:

Вы можете использовать IN:

SELECT *
FROM Table1
WHERE Claim IN (SELECT Claim
                FROM Table1
                WHERE Total > 500)

Демо-версия Sql Fiddle

Ответ №1

Это должно работать

Select DISTINCT Claim FROM yourtable Where Total > 500

РЕДАКТИРОВАТЬ:

В случае, если мой первоначальный ответ не соответствует вашим требованиям, вы можете использовать подзапрос. Подзапрос — это запрос внутри вашего запроса (вложенные запросы). Причина, по которой мы должны это делать, состоит в том, что если вы используете что-то вроде

Select * FROM yourtable Where Total > 500

Тогда результирующим набором будут только те моменты, когда общая сумма иска была выше 500, но это не указывает другие моменты, когда она была меньше или равна 500.

Поэтому, как утверждали другие, вы используете подзапрос вроде:

SELECT *
FROM Table1
WHERE Claim IN (SELECT Claim
FROM Table1
WHERE Total > 500)

Примечание: см., Что есть запрос после ключевого слова IN, поэтому у нас есть вложенные запросы (или подзапрос, если вы предпочитаете).

Почему это работает? ну, потому что:

SELECT Claim
FROM Table1
WHERE Total > 500

Вернет каждое требование (только номер претензии), в котором сумма была больше 500 в какой-то момент. Поэтому этот запрос будет возвращать 1 и 2. Если вы замените это в исходном запросе, вы получите:

SELECT *
FROM Table1
WHERE Claim IN (1, 2)

Который доставит вам каждый столбец каждой строки с номерами претензий, равными 1 или 2.

Ответ №2

Попробуй это:

Select * from table where claim in (Select claim from table where total > 500)

Здесь table — это имя вашей таблицы.

Ответ №3

Это может быть решение

    SELECT distinct *
FROM YourTableName
WHERE claim# IN (SELECT DISTINCT claim#
FROM YourTableName
WHERE total > 500)
ORDER BY 3;

По желанию

Ответ №4

Вы можете определить, какие значения [Claim#] удовлетворяют вашему условию…

SELECT DISTINCT [Claim#]
FROM YourTable
WHERE [Total] > 500

Если это было правильно, используйте его в качестве подзапроса, который вы INNER JOIN в свою таблицу, чтобы ограничить набор результатов только этими претензиями.

SELECT y.[Claim#], y.[Total], y.[ValidationDt]
FROM YourTable AS y
INNER JOIN
(
SELECT DISTINCT [Claim#]
FROM YourTable
WHERE [Total] > 500
) AS sub
ON y.[Claim#] = sub.[Claim#];

Сравните этот подход с предложениями IN() и посмотрите, заметите ли вы какую-либо разницу в скорости выполнения.

Ответ №5

Вы должны иметь возможность использовать

  SELECT [Claim#],[Total],[ValidationDt]
FROM yourtable
WHERE [Claim#] IN (SELECT [Claim#]
FROM yourtable
WHERE Total >= 500)

Должен возвращать все значения> = 500 для любого ValidationDt.

Оцените статью
TechArks.Ru
Добавить комментарий