【发布时间】: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 中的 Failures 和 Hours 中的 #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 TYPE 和 GROUPED 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
我希望上面的查询可以得到所有 ReportDate 和 DateReceived 都在一年内的记录。这将生成每季度 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'不符合您的预期。它选择所有非 NULLR.Confirmed值。请改用AND。
标签: sql sql-server date count range