【发布时间】: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