【问题标题】:SQL: How to do calculations for certain ranges of dates with all data in tableSQL:如何使用表中的所有数据对某些日期范围进行计算
【发布时间】:2014-05-20 21:49:06
【问题描述】:

我知道标题听起来很简单。然而,这确实是我当时唯一能想到的措辞。让我进一步解释

我在Repairs 上获得修复数据,我将INNER JOIN 发送到SN 上的Hours

我需要对每个季度开始后一年内的表格中的每一行进行计算。以下是我组织的季度开始日期:

第一季度开始日期 = 1 月 1 日; Q2 开始日期 = 4 月 1 日; 第三季度开始日期 = 7 月 1 日; 第 4 季度开始日期 = 10 月 1 日

所以,我需要从 1 月 1 日到 12 月 31 日计算 Repairs 中的 FailuresHours 中的 #OfHours; 4 月 1 日到次年的 3 月 31 日,等等......我需要 sum 将所有失败时间计算到小时以计算平均失败间隔时间。

请有人帮我开始这个查询;这开始让我感到沮丧,我是一名实习生,想在不问经理的情况下完成这项工作。谢谢

我知道我想做什么,但我在脑子里乱七八糟的语法来做。

编辑:

以下是我获取我想要的原始数据的查询:

SELECT * 
FROM Hours H
INNER JOIN Repair R
ON H.SN = R.SN  
WHERE R.Confirmed NOT LIKE 'OC%' OR R.Confirmed NOT LIKE 'YC%'

因为有超过 70,000 行,所以我会将计算结果限制为 20;示例结果如下(我只包括了相关列:

-------------------------------------------------------------------
SN    |Type    |Hours    |ReportDate    |Part    |DateReceived    | 
-------------------------------------------------------------------
1111  |Ford    |170      |2012-05-01    |9000000 |2012-10-19 
2222  |Ford    |170      |2012-05-01    |9000001 |2012-10-12 
3333  |Ford    |170      |2012-05-01    |9000002 |2012-10-19 
4444  |Chevy   |180      |2013-04-01    |9000001 |2014-04-04 
5555  |Chevy   |180      |2013-04-01    |9000002 |2014-03-30 
6666  |Chevy   |180      |2013-04-01    |9000003 |2014-04-04 
7777  |Dodge   |180      |2012-03-01    |9000001 |2012-03-30 
8888  |Dodge   |174      |2012-03-01    |9000001 |2012-04-04 
9999  |Dodge   |174      |2012-03-01    |9000001 |2012-03-30 
1212  |Chevy   |210      |2012-03-01    |9000002 |2012-04-04 
2323  |Lincoln |140      |2010-04-01    |9000001 |2012-05-30 
3434  |Lincoln |140      |2010-04-01    |9000002 |2012-04-04 
4545  |Lincoln |140      |2010-04-01    |9000000 |2012-03-30 
5656  |Dodge   |10       |2010-02-01    |9000004 |2012-04-04 
6767  |Chevy   |190      |2011-02-01    |9000005 |2012-03-30 
7878  |Lincoln |160      |2011-02-01    |9000000 |2012-04-04 
8989  |Dodge   |140      |2011-06-01    |9000001 |2012-03-30 
0101  |Chevy   |169      |2011-07-01    |9000001 |2012-04-04 

我必须进行 MTBF 计算 GROUPED BY TYPEGROUPED BY PART。如前所述,我需要检索季度之间的年份之间的所有报告日期。我脑子里乱七八糟,无法掌握要执行此操作的查询。

任何帮助都会很棒。谢谢

编辑:为了更好地了解我想要做什么

以下是我想要做的一个很好的例子,但它需要在每个季度完成(虽然这个查询没有产生我想要的结果):

DECLARE @BeginDate date = '1013-01-01'
BEGIN
SELECT * 
FROM Hours H
INNER JOIN Repair R
ON H.SN = R.SN 
WHERE (R.Confirmed NOT LIKE 'OC%' OR R.Confirmed NOT LIKE 'YC%') AND (DATEDIFF([DAY], @BeginDate, DateReceived) <= 365) AND (DATEDIFF([DAY], @BeginDate, ReportDate) <= 365)
END

我希望上面的查询可以得到所有 ReportDateDateReceived 都在一年内的记录。这将生成每季度 I.E 的年度报告。 1 月 1 日至 12 月 31 日、4 月 1 日至 3 月 31 日、7 月 1 日至 9 月 31 日以及 10 月 1 日至 12 月 31 日。

同样,这并没有产生我想要的结果,但也许会让我更好地理解我正在尝试做的事情。同样,每个季度都必须这样做。

编辑:下面是给定上述查询的一些示例输出的样子。为了提高效率,我将Type 列更改为单个字母;它不相关:

【问题讨论】:

  • 你能举一个你的数据的具体例子吗?像一些具有相关列的行?或者至少是列名?这将有助于帮助你。
  • 是的......不过会是一分钟......我必须“模拟”它(敏感)
  • @magic_al 我提供了一些示例数据,我也忘记在Repairs 中添加一列Date Received 是失败日期...ReportDate 列是我的月报日期了解运行时间。
  • @magic_al 我还添加了“虚拟”DateReceived 数据
  • (1) 对于提供的数据,能否举个例子说明你想要输出什么; (2) R.Confirmed NOT LIKE 'OC' OR R.Confirmed NOT LIKE 'YC' 不符合您的预期。它选择所有非 NULL R.Confirmed 值。请改用AND

标签: sql sql-server date count range


【解决方案1】:

我确定这不是您想要的一切(您提到了 MTBF),但应该足以让您足够接近。根据您显示的数据,这里是每个零件的报告,它失败的次数以及每个列出的季度之前每年的维修小时数。请注意,您坚持 ReportDate DateReceived 在同一尾随年份将导致误导性结果,因为它不包括,例如,SN 4545 ReportDate 1/4/2010 和 ReceivedDate 3/30/ 2012 年。那是 140 小时,不会出现在报告的任何地方。这真的是你想要的吗?

WITH
Quarters AS
( SELECT  DATE '2011-01-01' as Quarter FROM dual UNION ALL
  SELECT  DATE '2011-04-01' FROM dual UNION ALL
  SELECT  DATE '2011-07-01' FROM dual UNION ALL
  SELECT  DATE '2011-10-01' FROM dual UNION ALL
  SELECT  DATE '2012-01-01' FROM dual UNION ALL
  SELECT  DATE '2012-04-01' FROM dual UNION ALL
  SELECT  DATE '2012-07-01' FROM dual UNION ALL
  SELECT  DATE '2012-10-01' FROM dual UNION ALL
  SELECT  DATE '2013-01-01' FROM dual UNION ALL
  SELECT  DATE '2013-04-01' FROM dual UNION ALL
  SELECT  DATE '2013-07-01' FROM dual UNION ALL
  SELECT  DATE '2013-10-01' FROM dual
),
ByQuarter AS
( SELECT  h.*, R.PART, R.DATERXD, Q.Quarter
  FROM    Hours H
  JOIN    REPAIR R
    ON    H.SN = R.SN
  JOIN    Quarters q
    ON    q.Quarter - r.DateRxd BETWEEN 1 AND 365
      AND q.Quarter - h.RptDate BETWEEN 1 AND 365
)
-- select  * from ByQuarter ORDER BY Quarter, RptDate, sn; -- Examine "raw" data
  SELECT  bq.Part, bq.Quarter, Count(1) as Failures, Sum( bq.Hours ) AS TotalHours
  FROM    ByQuarter bq
  GROUP BY Part, Quarter
  order by Part, Quarter;

【讨论】:

  • 感谢您的回复!很有帮助
猜你喜欢
  • 2018-11-11
  • 1970-01-01
  • 1970-01-01
  • 2014-12-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多