Доступ к SQL Group по условию - PullRequest
0 голосов
/ 11 марта 2019

Я использую MS Access для следующей задачи (из-за офисных ограничений). Я совершенно новичок в SQL.

У меня есть следующая таблица:

Я хочу выбрать все магазины, сгруппированные по улицам, почтовым индексам и местам. Но я хочу сгруппировать их, только если SquareSum (после Group by) равен <1000. Rue de gare 2 следует сгруппировать, а Bahnhofstrasse 23 - отдельные линии. </p>

Насколько я знаю, MS Access не позволяет использовать регистр. Итак, мой запрос выглядит так:

SELECT 
Street,
ZIP,
Place,
Sum(Square) AS SumSquare, 
FROM Table1 
SWITCH (SumSquare > 1000, GROUP BY (Street, ZIP, Place))

Я тоже пробовал:

GROUP BY
SWITCH (SumSquare > 1000, (Street, ZIP, Place))

Но мне постоянно говорят, что у меня синтаксическая ошибка. Может ли кто-нибудь помочь мне?

Ответы [ 2 ]

1 голос
/ 11 марта 2019

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

SELECT ts.*
FROM (SELECT Street, Zip, Place, SUM(Square) as SumSquare
      FROM Table1
      GROUP BY Street, Zip, Place
     ) as ts
WHERE ts.SumSquare < 1000
UNION ALL
SELECT t1.*
FROM Table1 as t1 INNER JOIN
     (SELECT Street, Zip, Place, SUM(Square) as SumSquare
      FROM Table1
      GROUP BY Street, Zip, Place
     ) as ts
     ON t1.Street = ts.Street AND t1.Zip = ts.Zip and t1.Place = ts.Place
WHERE ts.SumSquare >= 1000
1 голос
/ 11 марта 2019

В Access я бы сделал это с несколькими запросами.

Это было бы проще сделать, если бы у вас был идентификатор в строках (например, автонумерация).

Первый запрос определяет улицы, которые должны быть суммированы.

запрос: SumTheseStreets

SELECT 
Street,
ZIP,
Place,
Sum(Square) AS SumSquare 
FROM Table1 
GROUP BY Street, ZIP, Place
HAVING sum(Square) < 1000

Обратите внимание на HAVING, который немного похож на WHEREПредложение, которое применяется за пределами GROUP BY или SUM

Второй запрос идентифицирует другие строки (примечания к этому ниже):

запрос: StreetsNotSummed

SELECT 
Street,
ZIP,
Place,
Square AS SumSquare 
FROM Table1
LEFT JOIN SumTheseStreets ON Table1.Street = SumTheseStreets.Street AND Table1.ZIP = SUmTheseStreets.ZIP AND Table1.Place = SumTheseStreets.Place
WHERE SumTheseStreets.Street IS NULL; 

Пара замечаний:

  • Я назвал поле SumSquare, потому что хочу, чтобы оно совпадало с именем поля SumSquare в первом запросе
  • В нем используетсяпервый запрос в качестве одной из входных «таблиц»
  • При этом используется LEFT JOIN, что означает «дать мне все строки в первой таблице (table1), и если какие-либо строки во второй таблице (SumTheseStreets) совпадают,также добавьте их.
  • , но затем он отфильтрует строки, которые действительно соответствуют.

Так что в этом запросе перечислены только улицы, которые вы НЕ хотите суммировать.

Итак, теперь вам нужен третий запрос. Он просто включает все строки в обоих запросах. Я не слишком удивленСинтаксис Access на этом, но есть мастер объединения запросов, если это не так.

Запрос: TheAnswerRequired

SELECT 
Street,
ZIP,
Place,
SumSquare
FROM SumTheseStreets

UNION

SELECT 
Street,
ZIP,
Place,
SumSquare
FROM StreetsNotSummed

(может потребоваться UNION ALL)

Удачи.

...