-2

试图尽可能地提出我的问题......

我有一个包含历史数据的定价表。因此,每件商品在某些日期都有价格。困难在于这些行还有一个类型(1 = 采购订单的价格,2 = 销售订单)和一个 VendorID。

该 VendorID 可以填写在一行中:该行上的价格是针对该特定供应商的。如果此表中的某个项目没有具有 VendorID 的行,但它确实有一行 VendorID 为空,则该行应该在结果中。

因此,如果结果中有两行,一行具有 VendorID 值,另一行 VendorID 为空,则具有该值的行应该在结果集中,而具有空值的行可能不在结果集中。

此外,结果集应该只包含最新的价格,所以我必须考虑“FromDate”。

'VendorID' 列的名称选择不当,因为 type = 2 的行用于销售订单,但现在让我们忘记它;-)

在此处输入图像描述

如果我想要 type = 1 的所有项目,希望有以下结果集:

ID | ItemID | FromDate   | Type | VendorID | price
------------------------------------------------
1  | 1.     | 2020-01-01 | 1    | 97       | 2.45
9  | 2      | 2020-02-15 | 1    | 97       | 3.88
7  | 3      | 2020-01-01 | 1    | 97       | 2.55

假设 ID 3,4 和 9 不在表中(因此,对于特定的 VendorID 97,项目 2 没有定价),结果应该是:

ID | ItemID | FromDate   | Type | VendorID | price
------------------------------------------------
1  | 1      | 2020-01-01 | 1    | 97       | 2.45
13 | 2      | 2020-01-01 | 1    | NULL     | 999.45
7  | 3      | 2020-01-01 | 1    | 97       | 2.55

对于 ItemID 2,这意味着没有为 VendorID 97 设置特定价格,但有一个通用价格集(VendorID 为空),现在应该将这个价格放在结果集中。

我希望我现在解释得更清楚了......

我现在写了很多查询,也搜索了很多,但我找不到如何让它做我想做的事。我尝试了不同的排序,但没有运气。一定很简单,但我找不到。

到目前为止,我有以下 Mysql 查询,但是 a)它输出 VendorID 为空的行和它具有值的行和 b)我认为它非常复杂,但无法弄清楚如何使它更简单和更快。

SELECT I.ItemID, I.Name, b.vendorID, b.max_date, IP.Price, T.Percentage
FROM Items I

 JOIN
    (
      SELECT ItemID, VendorID, MAX(FromDate) max_date, type
      FROM ItemPrices
    WHERE 
    Type = 1 AND
    FromDate < '2020-02-30' AND
    VendorID = (SELECT ID FROM Vendors WHERE VendorID = 'V001') OR VendorID IS NULL
    GROUP BY ItemID, VendorID

     ) b ON I.ID = b.ItemID

JOIN ItemPrices IP ON IP.ItemID = b.ItemID AND IP.Type = b.type AND IP.FromDate = b.max_date AND (IP.VendorID = b.VendorID OR IP.VendorID IS NULL)

LEFT JOIN TaxCodes T ON T.ID =

(
  SELECT TC.TaxCodeID FROM TaxCombinations TC
  WHERE
  TC.Direction = 1 AND
  TC.TaxAreaID = (SELECT TaxArea FROM Vendors WHERE ID = (SELECT ID FROM Vendors WHERE VendorID = 'V001') )
  AND TC.ItemTaxID = I.ItemTaxID
)


ORDER BY I.ItemID ASC

还查看了以下网址,但仍然不知道该怎么做:
具有非空值优先于空值的不同行
如果存在则选择非空值否则为空,但始终选择该行

有人可以帮帮我吗?

4

1 回答 1

0

NOT EXISTS

select t.* from tablename t
where t.vendorid is not null
or not exists (
  select 1 from tablename
  where itemid = t.itemid and vendorid is not null
)

请参阅演示

于 2020-02-09T18:06:47.797 回答