微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

MS Query

如何解决MS Query

我有一个Excel电子表格,可以将其用作我的牛奶回合的关系数据库。我使用Excel中的MS Query(Mac 2011版本)查询数据库生成我的传递路线。列之一是客户地址,我希望每笔订单显示一次,即在显示其他多行的同时仅针对该列进行查询。纯粹出于装饰目的,可以使电子表格变得更整洁。

我用作数据库的主电子表格具有我截屏的列标题,并带有一些示例数据:

Headings & Sample data

在此主电子表格中,我使用MS Query生成了如下所示的送货路线:

Test_Roundsbook

如您所见,查询生成的路由中有很多重复的数据。我想做的是每个客户的订单只有一个地址实例,这将有助于在iPad中打开路线时保持清晰。我隐藏了在这方面没有真正帮助的其他列。

*编辑 从下面的isolated注释中,这是理想情况下从查询返回的数据的外观的屏幕截图:

Finished route

我已手动删除了“名称和地址”列中的重复信息,以实现所需的结果。我还隐藏了一些不必要的列,并使用一些条件格式设置规则来帮助区分每个客户的订单。

编辑*

我尝试使用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)

enter image description here

然后您可以隐藏列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

enter image description here

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。