【问题标题】:Access query combine two tables with criteria访问查询将两个表与条件结合起来
【发布时间】:2017-01-04 19:15:18
【问题描述】:

下面的代码引用了两个表。每个表的结构都相同,唯一的区别是“PRICE”和“PRICE_DATE”值。这是因为它是一年前创建的同一张表。我想要做的就是有一个新表,它将每个基金的每个表中的最新价格插入到一个新表中。除此之外,我还想要另一个计算增长的列。 下面的代码适用于此目的。

SELECT [2015_11_Fund_Prices].FUND_CODE, [2015_11_Fund_Prices].PRICE AS 
[PRICE_@_112015], [2016_11_Fund_Prices].PRICE AS [PRICE_@_112016]
([2016_11_Fund_Prices].[PRICE]/[2015_11_Fund_Prices].[PRICE]-1) AS Growth INTO 2016_11_Monthly_Fund_Prices
FROM 2016_11_Fund_Prices INNER JOIN 2015_11_Fund_Prices ON [2016_11_Fund_Prices].FUND_CODE = [2015_11_Fund_Prices].FUND_CODE
GROUP BY [2015_11_Fund_Prices].FUND_CODE, [2015_11_Fund_Prices].PRICE_DATE, [2015_11_Fund_Prices].PRICE, [2016_11_Fund_Prices].PRICE, [2016_11_Fund_Prices].PRICE_DATE, ([2016_11_Fund_Prices].[PRICE]/[2015_11_Fund_Prices].[PRICE]-1)
HAVING ((([2015_11_Fund_Prices].PRICE_DATE)=#24/11/2015#) AND (([2016_11_Fund_Prices].PRICE_DATE)=#24/11/2016#));

但是,此代码假定两个表中的最新价格都是 24/11。我想用一个 max 函数替换它,这将导致查询仅引用具有最高日期值的行中的价格。

有人可以帮忙吗? 使用的表格是

    +-----------+------------+-------+
    | Fund_Code | PRICE_DATE | PRICE |
    +-----------+------------+-------+
    |         1 | 12/12/12   | 1     |
    |         1 | 13/12/12   | 1.2   |
    |         1 | 14/12/12   | 1.1   |
    |         2 | 12/12/12   | 1.12  |
    |         2 | 13/12/12   | 1.13  |
    |         2 | 14/12/12   | 1.11  |

所以第二张表完全相同,但日期对应于下一年。 我想要的只是一张桌子:

Fund_Code Price1 Price2 Growth

谢谢

【问题讨论】:

    标签: sql ms-access subquery where having


    【解决方案1】:

    你需要这样的子查询:

    SELECT FUND_CODE, MAX(PRICE_DATE) AS MaxPriceDate FROM 2016_11_Fund_Prices GROUP BY FUND_CODE
    

    如果您将此子查询添加到上面并将其链接到FUND_CODEPRICE_DATE=MaxPriceDate 上的2016_11_Fund_Prices 表,它应该可以满足您的需要。

    SELECT 2016_11_Fund_Prices.FUND_CODE, PRICE, PRICE_DATE
    FROM 2016_11_Fund_Prices
        INNER JOIN (SELECT FUND_CODE, MAX(PRICE_DATE) AS MaxPriceDate FROM 2016_11_Fund_Prices GROUP BY FUND_CODE) mp
            ON 2016_11_Fund_Prices.FUND_CODE=mp.FUND_CODE AND 2016_11_Fund_Prices.PRICE_DATE=mp.MaxPriceDate
    

    【讨论】:

    • 所以你建议有两个查询来生成结果?我认为这是可能的。
    • 另外,为什么当我在上面的代码中添加“SELECT PRICE”时,结果会再次返回所有日期而不仅仅是最大值?
    • 您可以将其作为子查询添加到您现有的查询中,但如果您将其用作单独的查询,则故障排除会不那么复杂。仅添加 SELECT PRICE 应该会给您一个错误,因为您既没有聚合也没有按 PRICE 分组。如果您也将 PRICE 添加到分组中,那么您将获得所有日期是有道理的,因为您现在对每个价格而不是每个 FUND_CODE 进行分组;这就是为什么您必须将其用作单独的子查询并且不能尝试通过仅向其添加 PRICE 来缩短它的原因。
    • 我用完整的子查询更新了我的解决方案,以获得最新的 2016 年价格
    • 好的,我明白了。所以你建议我先对两张桌子都这样做,然后再合并?所以总共有3个查询?这是我已经知道该怎么做的事情。它试图让它进入 1 Query 是我苦苦挣扎的地方。非常感谢您的帮助!
    猜你喜欢
    • 2020-06-08
    • 2019-04-12
    • 2021-09-28
    • 2020-12-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-12
    相关资源
    最近更新 更多