#excel #distinct-values #ms-query
#excel #distinct-значения #ms-query
Вопрос:
У меня есть электронная таблица Excel, которую я использую в качестве реляционной базы данных для моего раунда молока. Я запрашиваю эту базу данных с помощью MS Query в Excel (версия Mac 2011) для создания моих маршрутов доставки. Один из столбцов — это адрес клиента, и я бы хотел, чтобы это отображалось один раз для каждого заказа, т.Е. Иметь отдельный запрос только для этого столбца при отображении нескольких других строк. Это чисто для косметических целей, чтобы сделать электронную таблицу менее загроможденной.
Основная электронная таблица, которую я использую в качестве своей базы данных, содержит заголовки столбцов, которые я сделал на скриншоте, в комплекте с некоторыми образцами данных:
Из этой основной таблицы я использую MS Query для создания маршрута доставки, который выглядит следующим образом:
Как вы можете видеть, в маршруте, сгенерированном из запроса, много повторяющихся данных. Что я хотел бы сделать, так это иметь только один экземпляр адреса для каждого заказа клиента, это помогло бы с удобочитаемостью маршрута при открытии на iPad. Я скрываю другие столбцы, которые на самом деле не нужны, чтобы помочь в этом отношении.
* РЕДАКТИРОВАТЬ из комментариев isolated ниже, вот скриншот того, как в идеале должны выглядеть данные, возвращаемые из запроса:
Я вручную удалил повторяющуюся информацию в столбце name amp; address для достижения желаемого результата. Я также скрыл некоторые столбцы, которые на самом деле не нужны, и я использую некоторые правила условного форматирования, чтобы помочь отличить заказ каждого клиента.
Редактировать*
Я пытался использовать предложение group by и следующую функцию window, но не могу заставить его работать:
SELECT *
FROM (
SELECT “All Orders”.”Route ID”,
“All Orders”.Name,
“All Orders”.Address
ROW_NUMBER() OVER(PARTITION BY “All Orders”.Address
ORDER BY “All Orders”.Address DESC) AS row_number
FROM “All Orders”
) AS rows
WHERE row_number = 1;
Всякий раз, когда я пытаюсь выполнить запрос, я получаю сообщение об ошибке, касающееся синтаксиса. Надеюсь, кто-нибудь может сказать мне, где я ошибаюсь!
Комментарии:
1. Как вы хотите, чтобы результат выглядел? Например, будет ли у Jane Bloggs по-прежнему две строки, но вы хотите отобразить адрес только в первой строке? Кроме того, почему у Joe Generic есть два идентификатора acc_id, один из которых соответствует Jane Bloggs?
2. Да, именно так, как вы описали. Только один адрес в столбце адреса для Джейн Блоггс, но с двумя строками для ее заказа. Джо Дженерик, имеющий 2 идентификатора acc_id, был опечаткой!
3. И я полагаю, вы не хотите выбирать только отдельный адрес из запроса, который возвращает ваш 2-й снимок экрана? Если вам все еще нужно, чтобы все отображалось (несколько строк для каждой учетной записи), поддерживает ли MS Query функцию ранжирования? Возможно, вы могли бы ранжировать каждую учетную запись / строку (acc 1, ранг 1-2-3 … acc2, ранг 1-2-3 и так Далее) в качестве подзапроса. Затем используйте оператор case, такой как (case when acct_prod_rank = 1 затем адрес else ‘ ‘).
4. Я отредактировал свой первоначальный вопрос, включив скриншот того, как будет выглядеть идеальный результат. Я не уверен, поддерживает ли MS Query функцию ранга, и не имел бы представления о правильном синтаксисе!
Ответ №1:
Я вообще не знаю MS Sql, но вы могли бы что-то сделать с формулой в Excel. Если вам не нравится это решение, просто напишите комментарий ниже, что вам все равно нужен маршрут sql, и я могу предоставить вам запрос, чтобы попытаться адаптироваться к ms sql.
Создайте другой столбец и назовите его address2 (или еще несколько столбцов, если ваше поле адреса состоит из нескольких столбцов).
Затем используйте эту / эти формулы и корректируйте по мере необходимости:
Column F (address2): =IF(A2=A1,"",C2)
Column G (town2): =IF(A2=A1,"",D2)
Затем вы можете скрыть столбцы C и D.
============= У П Д А Т Е
Вот метод, который работает во многих СУБД, таких как postgres, но я не знаю, как адаптировать [rank() over (partition by …] к excel sql.
select account,
cust_name,
item,
case
when prod_rank = 1 then address
else ''
end address
from (
select
account,
cust_name,
item,
address,
rank() over (partition by account order by item) as prod_rank
from table1
)z
order by account, item
Я попробовал несколько вариантов в Excel sql и, наконец, заставил этот работать.
select a.Account,
a.Name,
a.Product,
Iif(a.product = b.min_item,a.address,'') as [address]
FROM table1 as a
,(
select
z.Account,
min(z.Product) as min_item
FROM table1 as z
group by z.Account ) as b
where b.account = a.Account
order by a.account, a.product
Комментарии:
1. Спасибо за изолированный ответ, в идеале SQL-запрос по-прежнему будет предпочтительным решением, поскольку позиция второго адресного столбца в Excel нарушит непрерывный возврат данных из запроса
2. Я вырос на молочной ферме и питаю слабость к водителям молока. Я надеюсь, что приведенное выше обновление работает для вас.
3. Привет, изолированный, еще раз спасибо за вашу помощь. К сожалению, обновление, похоже, не работает, я получаю сообщение об ошибке «нет такой функции: if». Есть ли опечатка перед оператором if в приведенном выше варианте Excel sql или это квадратная скобка? В любом случае это не сработает, я надеюсь, что ваше слабое место останется для нас, водителей доставки, еще некоторое время!
4. Это должно быть «iif» (два i). Если это все еще не работает, то у меня нет идей, извините. Работает для меня, но я пользователь ПК в Excel 2016.
5. К сожалению, он по-прежнему выдает мне ту же ошибку: «нет такой функции: iif». Я действительно ценю всю вашу помощь в этом изолированном, большое спасибо за попытку!