首页 > 解决方案 > 记录中没有日期需要过滤查询中的数据

问题描述

我有一个关于 sql 的问题,也许有人可以帮助我。在这种情况下,我有一个表,其中记录如下所示:

    Name       Account       Percent    MonthValue   DateFrom
    Element1   500             15       500         2016-01-01
    Element1   501             45       500         2016-01-01
    Element1   502             40       500         2016-01-01
    Element1   500             100      500         2017-01-01
    Element2   503             80       3000        2016-01-01
    Element2   504             20       3000        2016-01-01
    Element2   505             45       3000        2017-06-01
    Element2   503             55       3000        2017-06-01

我必须显示结果,每隔一个月我可以看到哪些元素占帐户的百分比。例如 2016 年 2 月的 Element1 帐户 501 的值 1000 实际上是 450 的 45%。当同一个元素有几个日期时,我无法显示值。例如,2016 年 12 月 Element1 有 3 个帐户,但 2017 年 1 月 Element1 有 1 个帐户。我有我应该算的日期,但我还没有我应该算的日期。我期望的结果是这样的:

我想知道 2016 年 12 月的账户和这些账户的百分比,我得到结果:

  Name      Account     Percent     Value
  Element1    500         15         75
  Element1    501         45         225
  Element1    502         40         200
  Element2    503         80         2400
  Element2    504         20         600

在其他情况下,我想知道 2017 年 6 月的账户和这些账户的百分比,然后我得到结果:

  Name      Account     Percent     Value
  Element1    500         100        500
  Element2    505         45         1350
  Element2    503         55         1650

我希望我能解释问题的重点。下面我以当前形式显示我的 sql:

SELECT
a.NAME, 
a.ACCOUNT,
a.PERCENT,
a.MONTHVALUE,
a.DATEFROM
from ELEMENTS a
where a.DATEFROM between :DATE_FROM and :DATE_TO 

其中 :DATE_FROM, :DATE_TO 是用于比较日期的参数(但我没有用于比较的列 :DATE_TO)。请帮我解决这个问题,我希望有人知道除了插入到有日期的表列之外的解决方案。

标签: sqlfirebirdfirebird2.5

解决方案


以下查询根据您的示例输出所需的结果:

declare @querydate date;
set @querydate = '2016-02-01'; --Set the desired query date

SELECT a.Name, a.Account, a.[Percent],
a.MonthValue * a.[Percent] / 100 as Value,
a.DateFrom
FROM ELEMENTS a
JOIN

(SELECT Name, MAX(DateFrom) as LastElementDate
FROM ELEMENTS
WHERE DateFrom <= @querydate
GROUP BY Name) b

ON a.Name = b.Name
AND a.DateFrom = b.LastElementDate

所以这里的想法是创建一个子查询(表 b),其中包含每个元素的最后记录日期。(MAX(DateFrom)。此外,@querydate 用于过滤日期高于所需日期的不需要的行。然后根据 Name 和 LastElementDate 将该表连接到主表,从而仅提取记录其日期与最后一个有效日期匹配。


推荐阅读