【问题标题】:Syntax for DISTINCT query on one column in MS QueryMS Query 中一列的 DISTINCT 查询的语法
【发布时间】:2021-01-18 10:36:35
【问题描述】:

我有一个 Excel 电子表格,我用它作为我的牛奶回合的关系数据库。我使用 Excel(Mac 2011 版)中的 MS Query 查询此数据库以生成我的交货路线。其中一列是客户地址,我希望每个订单显示一次,即在显示多个其他行的同时仅对该列进行不同的查询。这纯粹是为了美观,让电子表格不那么杂乱。

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

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

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

*编辑 从下面的隔离的 cmets 中,这是从查询返回的数据的理想外观的屏幕截图:

我已经手动删除了名称和地址栏中的重复信息以达到预期的效果。我还隐藏了一些不必要的列,并使用一些条件格式规则来帮助区分每个客户的订单。

编辑*

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

每当我尝试运行查询时,我都会收到有关语法的错误消息。希望有人能告诉我哪里出错了!

【问题讨论】:

  • 您希望输出看起来如何?例如,Jane Bloggs 是否仍然有两行,但您只想在第一行显示地址?另外,为什么 Joe Generic 有两个 acc_id,其中一个与 Jane Bloggs 匹配?
  • 是的,正是您所描述的。 Jane Bloggs 的地址栏中只有一个地址,但她的订单有两行。 Joe Generic 有 2 个 acc_id 是一个错字!
  • 我想你不想从返回你的第二个屏幕截图的查询中只选择不同的地址?如果您仍然需要显示所有内容(每个帐户多行),那么 MS Query 是否支持排名功能?也许您可以将每个帐户/行(acc 1、rank 1-2-3...acc2、rank 1-2-3 等等)作为子查询进行排名。然后使用 case 语句,例如 (case when acct_prod_rank = 1 then address else ' ')。
  • 我已经编辑了我的原始问题,以包含理想结果的屏幕截图。我不确定 MS Query 是否支持 rank 函数并且不知道正确的语法!

标签: excel distinct-values 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。

============= 更新日期

这是一种适用于许多dbms(例如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

【讨论】:

  • 感谢您的回答隔离,理想情况下,SQL 查询仍然是首选解决方案,因为 Excel 中第二个地址列的位置会破坏查询返回的连续数据
  • 我在奶牛场长大,对牛奶司机情有独钟。我希望上面的更新对你有用。
  • 您好,隔离,再次感谢您的帮助。不幸的是,更新似乎不起作用,我收到一条错误消息,说“没有这样的功能:如果”。上面的 excel sql 变体中的 if 语句之前有错字还是方括号?无论哪种方式都行不通,我希望您对我们的送货司机情有独钟!
  • 应该是“iif”(两个i)。如果这仍然不起作用,那么对不起,我没有想法。对我有用,但我是 excel 2016 的 PC 用户。
  • 不幸的是,它仍然给我同样的错误,“没有这样的功能:iif”。非常感谢您对这个孤立的所有帮助,非常感谢您的尝试!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-25
  • 1970-01-01
  • 2016-05-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多