【问题标题】:Return date 7 days passed target date | SQL返回日期 超过目标日期 7 天 | SQL
【发布时间】:2021-06-28 20:42:56
【问题描述】:

我正在尝试让所有仍处于打开状态的票在指定的“关闭”日期前 7 天,而“开票日期”在 7 天后。门票看起来像:

Work Order: Description:     Status:     Task:     End Date:     Billed On:
---------------------------------------------------------------------------
INC1234     Broken Monitor   OPEN        1         03/25/2021    03/25/2021
INC1235     No Audio         OPEN        1         04/03/2021    04/01/2021
    

理论上,查询只会返回INC1234,因为此票证符合条件。工单号、描述、开单日期和状态存储在一个表中,任务存储在另一个表中,结束日期存储在第三个表中。

我有什么:

SELECT DISTINCT
    wo.proposal AS 'Work Order',
    wo.description AS 'Description',
    wo.status_code AS 'Status',
    phs.task AS 'Task',
    wo.act_end_dt AS 'End Date',
    fnd.tranx_date AS 'Billed On'
FROM
    table1 wo
LEFT OUTER JOIN
    table2 phs ON (wo.proposal = phs.proposal)
LEFT OUTER JOIN
    table3 fnd ON (wo.proposal = fnd.proposal)
WHERE
    wo.status_code = 'OPEN'
    AND phs.act_end_dt <= DATEADD(day, -7, GETDATE())
    AND fnd.tranx_date <= DATEADD(day, -7, GETDATE())

有时一张票会收取多张账单。此查询似乎只获取第一个计费交易而不是最新交易。 (因此,如果它在 3 月 23 日和 3 月 31 日有账单,它只会抓住 3 月 23 日,这是不正确的)我似乎无法让它抓住最新的账单日期并从那时起 7 天。

【问题讨论】:

  • left join 在这里没有意义,应该是inner join。你为什么distinct ing?它不是抓取第一笔交易,而是抓取那些日期内的所有交易。您需要的是类似于exists 在事务表上检查是否有任何给定的proposal 在日期之前。
  • @Charlieface 有时它会多次返回同一张票。就像现在我运行它,它显示一张票证相同的票证#、描述、状态、任务#、结束日期和交易日期 - 所以我试图阻止它,但它似乎不起作用。
  • 那么您的联接有问题。告诉我们这些表实际上是什么以及它们如何相互关联(主键和外键)会有很大帮助

标签: sql sql-server date-arithmetic


【解决方案1】:

工单、描述、状态码和结束日期来自同一张表。 任务来自另一个表。 Billed On 来自另一个表。

你想获取一个票号对应表的最新交易。一种解决方案可以是定义一个视图,该视图将包含该表的子集,其中每个工单仅出现一次,并具有最大日期。然后您可以在查询中使用该视图;只需将 table3 替换为该视图即可。

视图可以写成聚合:

select proposal, max(tranx_date) from table3 group by proposal;

假设视图名为 table3_view,那么您的查询可以像您一样通过将 table3 替换为 table3_view 来编写:

SELECT DISTINCT
wo.proposal AS 'Work Order',
wo.description AS 'Description',
wo.status_code AS 'Status',
phs.task AS 'Task',
wo.act_end_dt AS 'End Date',
fnd.tranx_date AS 'Billed On'
FROM
table1 wo
LEFT OUTER JOIN
table2 phs ON (wo.proposal = phs.proposal)
LEFT OUTER JOIN
table3_view fnd ON (wo.proposal = fnd.proposal)
WHERE
wo.status_code = 'OPEN'
AND
phs.act_end_dt <= DATEADD(day, -7, GETDATE())
AND
fnd.tranx_date <= DATEADD(day, -7, GETDATE())

【讨论】:

  • 恐怕我不太明白。我是否将select proposal, max(tranx_date) from table3 group by proposal; 添加到查询的开头,以便在左连接后使用table3_view
  • 可以像这样创建视图,例如:create view table3_view as select proposal, max(tranx_date) from table3 group by proposal; - 尝试使用它。
  • 我能够创建视图,但是它仍然返回每个事务条目,而不仅仅是最新的。例如,它返回给我一张票,但向我显示了 9 次票,因为它有 9 次计费。
  • 这可能与其他人指出的加入方式有关;我认为你做对了,并展示了一种从 table3 获取最新票务交易的方法。我相信您需要提供更好的信息才能获得更好的帮助。如果您不介意,请描述三个表(列、类型和主键)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-08-12
  • 1970-01-01
  • 2018-12-23
  • 1970-01-01
  • 2011-11-05
  • 2011-08-10
  • 2014-04-20
相关资源
最近更新 更多