2014-01-15 23 views
1

基本上我试图从表中添加一些字段并重现另一张表,但没有运气。MYSQL在给定的时间戳列内求和的字段

初始表看起来像;

ID STATUS  Min  Max  Mean TimeStamp 
1 Motor1-ON  10  20  15  12/01/2013 05:00 
2 Motor1-OFF  5  7   6  12/01/2013 05:00 
3 Motor1- HOLD 1  3   2  12/01/2013 05:00 
4 Motor2-ON  8  12  10  12/01/2013 05:00 
5 Motor2-OFF  4  6   5  12/01/2013 05:00 
6 Motor2-HOLD 1  5   3  12/01/2013 05:00 

7 Motor1-ON  11  21  16  12/01/2013 05:10 
8 Motor1-OFF  5  7   6  12/01/2013 05:10 
9 Motor1- HOLD 1  3   2  12/01/2013 05:10 
10 Motor2-ON  9  10  9.5 12/01/2013 05:10 
11 Motor2-OFF  5  7   6  12/01/2013 05:10 
12 Motor2-HOLD 1  5   3  12/01/2013 05:10 
.  .   .  .   .   . 
.  .   .  .   .   . 
.  .   .  .   .   . 

状态为两种类型给出:电机1和电机2为每10分钟增加一个时间戳。 我试图创建一个基于第一个表的新表,以便为每个时间戳添加电机1和电机2的3个状态。我尝试实现的表(目前为止没有运气)应该看起来像;

Timestamp  Total_ON Total_ON Total_ON Total_OFF Total_OFF Total_OFF 
        _Min  _Max  _Mean  _Min  _Max   _Mean 

12/01/2013 05:00  18  32   35   9   13   11 
12/01/2013 05:10  20  31   25.5   10   14   12 
    .     .    .     .   .    . 
    .     .    .     .   .    . 

(表继续到包括Total_Hold_Min,Total_Hold_Max,Total_Hold_Mean)

Total_ON_Min = Motor 1_ON Min + Motor 2_ON Min (For its given Timestamp) 

Total_ON_Max = Motor1_ON Max + Motor2_OFF Max (For its given Timestamp) 

Total_ON_Mean = Motor1_ON Mean + Motor2_OFF Mean (For its given Timestamp) 

等等...。

任何人都可以提供任何建议正确的mysql语句,我应该看着实现这一点。我一直试图实现CrossTab没有成功。使用选择语句和总计函数分别计算马达1和马达2的单独总计是没有问题的,但在每个时间戳内添加两个字段我没有成功

任何想法或相关链接大加赞赏,因为我试图建立在我的知识基础

我是新来的mysql

感谢

附加信息:

电机状态是非常独立和静态的,所以我不能分解它。数据透视表失去了我需要指出的灵活性。我提出了一个基于给定想法的解决方案,该解决方案适用于总共Min。

SELECT 

`timestamp`, 

status, 

SUM(Min) AS `Total_ON_MIN` FROM Tablename where Status IN('Motor1_on','Motor2_on') 
FROM table 

GROUP BY `timestamp` 

我就用这个方法通过时间戳“Total_Max_ON”等带来随着错误的集团虽然未能达到。

SELECT 
    `timestamp`, 
    status, 

(SELECT SUM(Min) AS `Total_ON_MIN` FROM Tablename where Status IN('Motor1_on','Motor2_on')), 

(SELECT SUM(Max) AS `Total_ON_MAX` FROM Tablename where Status IN('Motor1_on','Motor2_on')), 

(SELECT SUM(Mean) AS `Total_ON_MEAN` FROM Tablename where Status IN('Motor1_on','Motor2_on')) 

GROUP BY `timestamp` 

任何想法用于进一步direction.Cheers

+0

搜寻有关如何转动在MySQL数据,然后一展身手的详细信息;如果卡住了,请回来寻求帮助。 – eggyal

+0

感谢您的指针。我会挖掘数据透视数据,看看它发生了什么。 – Tino88

回答

0

你应当认真考虑拆分马达标识符(即电机1,电动机2)和状态指示器(开/关/保持)成两个独立的字段。

然后,您可以方便地查询像

SELECT 
    `timestamp`, 
    SUM(CASE WHEN status = 'ON' THEN Min ELSE 0 END CASE) AS `ON_Min`, 
    SUM(CASE WHEN status = 'ON' THEN Max ELSE 0 END CASE) AS `ON_Max`, 
    SUM(CASE WHEN status = 'ON' THEN Mean ELSE 0 END CASE) AS `ON_Mean`, 
    SUM(CASE WHEN status = 'OFF' THEN Min ELSE 0 END CASE) AS `OFF_Min`, 
    SUM(CASE WHEN status = 'OFF' THEN Max ELSE 0 END CASE) AS `OFF_Max`, 
    SUM(CASE WHEN status = 'OFF' THEN Mean ELSE 0 END CASE) AS `OFF_Mean` 
FROM table 
GROUP BY `timestamp` 
ORDER BY `timestamp` ASC 

或者如果你真的不需要一个支点,你可以做

SELECT 
    `timestamp`, 
    status, 
    SUM(Min) AS `Min_Sum`, 
    SUM(Max) AS `Max_Sum`, 
    SUM(Mean) AS `Mean_Sum` 
FROM table 
GROUP BY `timestamp`, status 
ORDER BY `timestamp` ASC, status ASC 

,或者需要由电机打破

SELECT 
    `timestamp`, 
    motor, 
    status, 
    SUM(Min) AS `Min_Sum`, 
    SUM(Max) AS `Max_Sum`, 
    SUM(Mean) AS `Mean_Sum` 
FROM table 
GROUP BY `timestamp`, motor, status 
ORDER BY `timestamp` ASC, motor ASC, status ASC 

如果你分解电机和状态,你会看到更多的灵活性来查询。

如果你绝对不能拆散的状态进入电机和状态,那么我会做到以下几点:

SELECT 
    `timestamp`, 
    SUM(CASE WHEN status LIKE '%ON' THEN Min ELSE 0 END CASE) AS `ON_Min`, 
    SUM(CASE WHEN status LIKE '%ON' THEN Max ELSE 0 END CASE) AS `ON_Max`, 
    SUM(CASE WHEN status LIKE '%ON' THEN Mean ELSE 0 END CASE) AS `ON_Mean`, 
    SUM(CASE WHEN status LIKE '%OFF' THEN Min ELSE 0 END CASE) AS `OFF_Min`, 
    SUM(CASE WHEN status LIKE '%OFF' THEN Max ELSE 0 END CASE) AS `OFF_Max`, 
    SUM(CASE WHEN status LIKE '%OFF' THEN Mean ELSE 0 END CASE) AS `OFF_Mean` 
FROM table 
GROUP BY `timestamp` 
ORDER BY `timestamp` ASC 
+0

感谢您的信息。电机状态几乎不能被分解。我根据您的想法Mike发布了有关零件解决方案的其他信息。尽管如此,我还没有完成。任何进一步的方向感激。 – Tino88

+0

@ Tino88在我的答案中查看更新。 –

+0

干杯。这样做更有意义。按预期工作。感谢您的意见。 – Tino88