【问题标题】:SELECT UnitCost on MAX(OrderDate) from another table从另一个表中选择 MAX(OrderDate) 上的 UnitCost
【发布时间】:2023-03-10 20:50:02
【问题描述】:

我们有一个带有采购订单标题表 (POHeader) 和采购订单行表 (PODetail) 的 ERP 系统。有成千上万的 POLines,其中许多零件在几年内被反复购买。我需要找到从上次购买时购买的每个部件的 UnitCost(采购订单的 max(OrderDate))。

我一直在玩SQL MAX(DATE) Order Number,对此我有几乎相同的要求。如果我们查看该线程中的解决方案代码:

SELECT t.ClientId, t.MaxDate, o.OrderNumber
FROM (SELECT ClientId, MAX(Date) as MaxDate
          FROM dbo.tblOrders
          GROUP BY ClientId) t
    INNER JOIN dbo.tblOrders o
        ON t.ClientId = o.ClientId
            AND t.MaxDate = o.Date

我的需求是相同的,我的 Part Number 是他的 ClientId,而我的 UnitCost 是他的 OrderNumber。快速替换会给我这样的东西:

SELECT t.PartNum, t.MaxDate, o.UnitCost
FROM (SELECT PartNum, MAX(OrderDate) as MaxDate
          FROM POdetail
          GROUP BY PartNum) t
    INNER JOIN POdetail o
        ON t.PartNum = o.PartNum
            AND t.MaxDate = o.Date

问题是采购订单日期存储在标题级别,而详细数据中没有日期。我必须在 POHeader 表中的 max(OrderDate) 中左加入,这就是我遇到问题的地方。

我尝试在 POHeader 表中的 OrderDate 中进行复合,但我的代码错误。这就是我停下来的地方。 有人可以帮我解决这个问题吗?

SELECT d.PartNum, h.MaxDate, d.UnitCost
    FROM 
    PODetail d
    Left Join POHeader h ON 
    (SELECT PONum, MAX(OrderDate) as MaxDate
              FROM POHeader
              GROUP BY PONum) t
        INNER JOIN POHeader o
            ON t.PONum = o.PONum
                AND t.MaxDate = o.OrderDate

这里有一些乱七八糟的数据...

create table POHeader (POnum int, OrderDate date);
insert into POHeader (PONum, OrderDate) values (12508, '05/13/2010');
insert into POHeader (PONum, OrderDate) values (12690, '06/04/2010');
insert into POHeader (PONum, OrderDate) values (12847, '09/08/2010');
create table PODetail (PONum int, PartNum varchar(15), Descript varchar(60), UnitCost numeric(10,2));
insert into PODetail (PONum, PartNum, Descript, UnitCost) values (12508, 'X37-BC055', 'PIPE, Titanium (MIL-T-9046), 3"OD x 8FT x .0125"', 6647.18);
insert into PODetail (PONum, PartNum, Descript, UnitCost) values (12690, 'X37-BC055', 'PIPE, Titanium (MIL-T-9046), 3"OD x 8FT x .0125"', 6651.90);
insert into PODetail (PONum, PartNum, Descript, UnitCost) values (12847, 'X37-BC055', 'PIPE, Titanium (MIL-T-9046), 3"OD x 8FT x .0125"', 6713.65);
insert into PODetail (PONum, PartNum, Descript, UnitCost) values (12690, 'N76-18824-ABN', 'COLLAR, Titanium (AMS 4902), 3"ID Flange', 564.13);
insert into PODetail (PONum, PartNum, Descript, UnitCost) values (12847, 'N76-18824-ABN', 'COLLAR, Titanium (AMS 4902), 3"ID Flange', 571.26);

你可以在历史数据中看到,我买了 3 次 8 英尺的管子和 2 次项圈。我正在努力达到这个结果 - 我最后一次购买每个零件:

PartNum        Max Date   Last Price
-------------  ---------- ----------
X37-BC055      9/08/2010     6713.65
N76-18824-ABN  6/04/2010      571.26

感谢您的帮助, 杰米

【问题讨论】:

  • 我对你正在尝试做的事情感到迷茫。
  • @GordonLinoff 我需要 PODetail 中所有部件的最后价格,从最后一次购买每个部件开始。除了每次购买的日期都在 POHeader 中,而不是在细节中。
  • 你使用什么数据库?标记您的问题
  • Progress 10 与 OpenEdge 通用 ODBC 驱动程序。我正在使用 WinSQL Lite

标签: sql date max openedge progress-db


【解决方案1】:

获取所有最后日期,然后加入表格:

select d.partnum PartNum, c.orderdate MaxDate, d.unitcost LastPrice
from podetail d 
inner join poheader h on h.ponum = d.ponum
inner join (
  select d.partnum, max(h.orderdate) orderdate
  from podetail d inner join poheader h
  on h.ponum = d.ponum
  group by d.partnum
) c on c.partnum = d.partnum and c.orderdate = h.orderdate

【讨论】:

  • 对不起。我看到了您的标签请求并添加了“进度”。此数据库不支持 CTE。是否有可能只加入老派?
【解决方案2】:

使用支持最大 dbms 的row_number()

   select * from
    (select ph.*,PartNum,UnitCost as lstPrice,row_number() over(partition by PartNum order by OrderDate desc) rn
   from POHeader ph INNER JOIN POdetail po
    ON ph.PONum = po.PONum
    ) a where a.rn=1

【讨论】:

  • 我的 SQL 编辑器在第三行的 POHeader 附近显示语法错误。该语句不会运行。
  • @JohnJoseph 我错过了写查询
  • 也应该是 ph.PONum = po.PONum
  • 就是这样!谢谢。没有 row_number 分区是否有可能?我的数据库不是 SQL Server,而是带有通用 ODBC 驱动程序的 Progress Open Edge。我正在使用 WinSQL Lite。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-04-10
  • 2016-07-22
  • 1970-01-01
  • 2019-02-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多