问题描述
我有一个Excel电子表格,可以将其用作我的牛奶回合的关系数据库。我使用Excel中的MS Query(Mac 2011版本)查询此数据库以生成我的传递路线。列之一是客户地址,我希望每笔订单显示一次,即在显示其他多行的同时仅针对该列进行查询。纯粹出于装饰目的,可以使电子表格变得更整洁。
我用作数据库的主电子表格具有我截屏的列标题,并带有一些示例数据:
在此主电子表格中,我使用MS Query生成了如下所示的送货路线:
如您所见,查询生成的路由中有很多重复的数据。我想做的是每个客户的订单只有一个地址实例,这将有助于在iPad中打开路线时保持清晰。我隐藏了在这方面没有真正帮助的其他列。
*编辑 从下面的isolated注释中,这是理想情况下从查询返回的数据的外观的屏幕截图:
我已手动删除了“名称和地址”列中的重复信息,以实现所需的结果。我还隐藏了一些不必要的列,并使用一些条件格式设置规则来帮助区分每个客户的订单。
编辑*
我尝试使用group by子句和以下窗口函数,但无法正常工作:
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;
每当我尝试运行查询时,都会收到有关语法的错误消息。希望有人能告诉我我要去哪里错了!
解决方法
我一点也不了解MS Sql,但是您可以使用excel中的公式来执行某些操作。如果您不喜欢此解决方案,只需在下面添加一条您仍希望使用sql路由的注释,然后我可以为您查询以尝试适应ms sql。
创建另一列,并将其命名为address2(如果您的地址字段为多列,则另外命名为几列)。
然后使用此/这些公式并根据需要进行调整:
Column F (address2): =IF(A2=A1,"",C2)
Column G (town2): =IF(A2=A1,D2)
然后您可以隐藏列C和D。
==============
这是一种可在许多dbms(例如postgres)中使用的方法,但我不知道如何将[rank()改成(分区...)以适应excel sql。
select account,cust_name,item,case
when prod_rank = 1 then address
else ''
end address
from (
select
account,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