【问题标题】:Calculate SUM from avg of max value从最大值的平均值计算 SUM
【发布时间】:2014-10-10 23:54:11
【问题描述】:

我想在一个查询中计算三次数据。 这是示例表:

Date#####| Time   |  Week  |  MachineID |   Value | Type
 1408_1  | 1408_1_1 |  1408  |  001 |    2    | Alert
 1408_1  | 1408_1_2 |  1408  |  001 |    4    | Alert
 1408_2  | 1408_1_1 |  1408  |  001 |    5    | Alert
 1408_2  | 1408_1_2 |  1408  |  001 |    6    | Alert
 1408_3  | 1408_1_1 |  1408  |  001 |    7    | Alert
 1408_3  | 1408_1_2 |  1408  |  001 |    5    | Alert
 1408_4  | 1408_1_1 |  1408  |  001 |    8    | Alert
 1408_4  | 1408_1_1 |  1408  |  001 |    5    | Alert
 1408_5  | 1408_1_1 |  1408  |  001 |   10    | Alert
 1408_5  | 1408_1_1 |  1408  |  001 |    5    | Alert
 1408_6  | 1408_1_1 |  1408  |  001 |    12   | Alert
 1408_6  | 1408_1_1 |  1408  |  001 |    5    | Alert
 1408_7  | 1408_1_1 |  1408  |  001 |    14   | Alert
 1408_7  | 1408_1_1 |  1408  |  001 |    5    | Alert
 1409_1  | 1409_1_1 |  1409  |  002 |     9   | Alert
 1409_1  | 1409_1_1 |  1409  |  003 |   14    | Alert

假设我有很多数据,我有: 1. 每周有 7 个日期(1-7), 2.对于每个日期,有几个时间(1-2), 3. 每次有几台机器操作(001 - 003)

这是上例的预期结果:

WEEK  | Value   |
 1408  |  61      |   --> the data already complete for this week
 1409  | 14       |   

.....长达 7 周

首先,我取每个组的最大数据,(假设:基于机器ID的组)

其次,我计算每个其他组的最大数量的平均值,(基于日期的组-在这种情况下只有日期 1 - 7)

第三,我再次对其他组之前的平均计算求和,(基于周的组)。

所以有三个组和三个选择,,,

我想根据 ASCENDING 顺序显示前 7 周...

到目前为止,这是我的代码:

Dim strCommand As String = "SELECT TOP 7 week, CAST(SUM(AP) as float) as [apLW], CAST(AVG(AR) AS FLOAT) AS [ARlw] FROM (SELECT TOP 7 WEEK, CAST(SUM(MaxScoreP) as float) AS [SP], CAST(AVG(MaxScoreP) as float) AS [AP], CAST(SUM(MaxScoreR) as float) AS [SR], CAST(AVG(MaxScoreR) as float) AS [AR] FROM " & _
     "(SELECT [date] AS DATE_, [machineID], week, MAX(CASE WHEN [Type] = 'Alert' THEN CAST(JL as float) END) as [MaxScoreP], MAX(CASE WHEN [Type] = 'ROLL-OUT' THEN CAST(JL as float) END) as [MaxScoreR] FROM tbl_tablename GROUP BY Week, [date], [machineID] ) AS m GROUP BY [Week] ORDER BY [Week] DESC) X GROUP BY [Week] ORDER BY [Week] ASC"

该代码在第二个 select 语句之前都可以正常工作,但是对于第三个 select (SUM) 似乎是错误的,因为它不会改变结果。 你对我的问题有什么建议吗?

编辑代码:

        Dim strCommand As String = " SELECT WEEK, date_, CAST(SUM(MaxScoreP) as float) AS [SP], CAST(AVG(MaxScoreP) as float) AS [AP] FROM " & _
                                "(SELECT [date] AS DATE_, [machineID], WEEK, MAX(CASE WHEN [Type] = 'PILOT' THEN CAST(JL as float) END) as [MaxScoreP] FROM " & _
                                "tbl_TBL_NAME GROUP BY WEEK, [date], [machineID] ) AS m GROUP BY [WEEK], [Date_] ORDER BY [WEEK] DESC"

到目前为止,我能够获得所有数据的每个日期的平均值。你有什么建议我接下来应该做什么来分组并获得每周的结果?

提前致谢。

【问题讨论】:

  • 你能发布你的预期输出吗?在你的第二部分你已经选择了前 7 条记录,所以它只会返回 7 条记录,是什么让你认为它可以进一步执行另一个平均值?如果可能的话,在 sqlfiddle 中创建一个模式,它有助于响应
  • @ah_hau 是的,你是对的......但如果我没有将前 7 名放在该选择中,我无法获得结果的升序......对不起,我从未使用过sqlfiddle 之前,但我在上面输入了一些数据表。查看编辑...
  • 也显示示例输出
  • 如果使用TOP n,您必须使用 ORDER BY,否则您可能无法获得预期效果
  • 感谢您提供的数据,现在告诉我们您对结果的期望...

标签: sql sql-server vb.net


【解决方案1】:

评论太长了。

您的最外层查询不会对数据进行任何更改,因为在您到达最外层之前它已经按 [Week] 分组 - 并且该层中根本没有任何新内容。

下面我建议你改变前 7 层的做法,并删除多余的最外层。

SELECT
      [Week]
    , CAST(SUM(MaxScoreP) AS float) AS [SP]
    , CAST(AVG(MaxScoreP) AS float) AS [AP]
    , CAST(SUM(MaxScoreR) AS float) AS [SR]
    , CAST(AVG(MaxScoreR) AS float) AS [AR]
FROM (
            SELECT
                  [date]                                                     AS DATE_
                , [machineID]
                , tbl_tablename.[Week]
                , MAX(CASE
                        WHEN [Type] = 'PILOT' THEN CAST(JL AS float) END)    AS [MaxScoreP]
                , MAX(CASE
                        WHEN [Type] = 'ROLL-OUT' THEN CAST(JL AS float) END) AS [MaxScoreR]
            FROM tbl_tablename
                  INNER JOIN (
                              SELECT TOP 7
                                    [Week]
                              FROM tbl_tablename
                              GROUP BY
                                    [Week]
                              ORDER BY
                                    [Week] DESC
                        ) AS w7
                              ON tbl_tablename.[Week] = w7.[Week]
            GROUP BY
                  tbl_tablename.[Week]
                , [date]
                , [machineID]
      ) AS m
GROUP BY
      [Week]
ORDER BY
      [Week] ASC 

注意您的示例数据不包含此查询使用的所有字段,虽然拥有数据是一个很好的开始,但知道您想要什么是我们也需要的结果。

【讨论】:

  • 我按照您的建议,根据我的问题进行了修改,我得到了结果...感谢您的帮助,非常感谢...
  • 太棒了!我相信您接受表明完成的答案。
  • 是的,,,经过一些修改,它可以用来得到答案......所以我会把它标记为答案..谢谢你的帮助..
猜你喜欢
  • 2016-11-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多