访问 - 交叉表查询 - 最接近的匹配

时间:2016-05-04 12:24:15

标签: mysql ms-access crosstab

问题是数据库缺少某些值,我需要在最近的交叉表查询中查找它们。

我交叉的表格似乎是这样的:

Source data

它缺少竞争对手价格的价值 - 对于第111项,我没有第一个竞争对手的第3周和第2个竞争对手的第2周的价格。对于项目222,我错过第一个竞争者的第二周价格和第二个竞争者的1,3周。我想在输出数据中使用最接近的周价格。

输出(用于价格指数计算)必须如下所示(列中的竞争者价格,以便在excel的数据透视表中进一步计算):

enter image description here

问题是如何“查找”最接近的周竞争对手的价格,我标记了橙色的缺失价格。

我希望问题很清楚,如果有任何问题 - 请问,我会尽力澄清一切! 非常感谢提前!

UPD。 我尝试以下面的方式(使用子查询):

     SELECT m_week, item_code, my_price, (SELECT TOP 1 com_price
     FROM MyTable AS T
     WHERE T.item_code = MyTable.item_code
     AND T.m_week <= MyTable.m_week
     AND competotor_id = 1
     ORDER BY T.m_week) AS Comp1_price, (SELECT TOP 1 com_price
     FROM MyTable AS T
     WHERE T.item_code = MyTable.item_code
     AND T.m_week <= MyTable.m_week
     AND competotor_id = 2
     ORDER BY T.m_week) AS Comp2_price
     ... the same for each competitor
     FROM MyTable

它有效...但非常慢,我需要为每个竞争对手复制/粘贴。接下来的事情 - 我想要不仅搜索价格,还要搜索价格(沿着几周)

1 个答案:

答案 0 :(得分:0)

您可以将交叉表基于使用子查询的查询: SELECT p.competitor_id, p.m_week, p.item_code, p.com_price, p.my_price,
nz(p.com_price, (Select top 1 week_price FROM ( SELECT m_week, item_code, Max(com_price) AS week_price FROM YourTable WHERE com_price Is Not Null GROUP BY m_week, item_code ) as WeekPrices WHERE [item_code]=p.item_code and m_week < p.m_week ORDER BY m_week desc)) as com_price_calc FROM YourTable AS p;

  • 这会产生表格,其中包含填写了空数据的com_price_calc列。
  • 我将YourTable别名为p - 为父
  • nz()函数仅用于访问,可以用ifnull()替换它 如果你使用mysql
  • 内部子查询显示每周价格 每个m_week - item_code组合,它不是null。
  • 外部子查询过滤父项item_code和前一周,因为它使用'ORDER BY m_week desc',前1将返回前几周 值。