0

SQL Fiddle のルート テーブルからのピボット テーブルがあります。このリンク:ピボット操作

ここで、「Arbeitszeit」、「Arbeitsende」、および「Projektzeit」と「Projektende」の違いを計算してみます。

問題は、複数の値がある場合、次のように計算が機能しないことです。

19.06.2013 07:27:27,19.06.2013 09:08:58

差異の結果だけを表示するには、データを分離するか、最良の場合はマージする必要があります。

これはインターフェイスによって生成されるため、他の方法でルート データを取得する可能性はありません。

4

1 に答える 1

1

私は、データが連結された形式で送られてくることを想定しています - あなたがそれを作成したわけではありません。substring_index()およびを使用してreverse()、数値を生成するテーブルと一緒に連結を解除できます。

次のクエリは、連結を元に戻し、結果をグループ化します。

select t.*,
  sum(HOUR(TIMEDIFF(STR_TO_DATE(Arbeitsbeginn, '%d.%m.%Y %H:%i:%s'), STR_TO_DATE(Arbeitsende, '%d.%m.%Y %H:%i:%s')))) AS ARBEITSZEIT,
  sum(HOUR(TIMEDIFF(STR_TO_DATE(Projektbeginn, '%d.%m.%Y %H:%i:%s'), STR_TO_DATE(Projektbeginn, '%d.%m.%Y %H:%i:%s')))) AS Projektzeit
FROM (select DriverName,
             (case when n.n = 1 then substring_index(arbeitsbeginn, ',', 1)
                   else reverse(substring_index(REVERSE(substring_index(arbeitsbeginn, ',', 2)), ',', 1))
              end) as arbeitsbeginn,
             (case when n.n = 1 then substring_index(arbeitsende, ',', 1)
                   else reverse(substring_index(REVERSE(substring_index(arbeitsende, ',', 2)), ',', 1))
              end) as arbeitsende,
             (case when n.n = 1 then substring_index(Projektbeginn, ',', 1)
                   else reverse(substring_index(REVERSE(substring_index(Projektbeginn, ',', 2)), ',', 1))
              end) as Projektbeginn,
             (case when n.n = 1 then substring_index(Projektbeginn, ',', 1)
                   else reverse(substring_index(REVERSE(substring_index(ProjektEnde, ',', 2)), ',', 1))
              end) as ProjektEnde
      from (SELECT DRIVERNAME, 
                   GROUP_CONCAT(IF(ACTIONTEXT = 'Arbeitsbeginn', DATETIME, NULL)) AS 'Arbeitsbeginn', 
                   GROUP_CONCAT(IF(ACTIONTEXT = 'Arbeitsende', DATETIME, NULL)) AS 'Arbeitsende', 
                   GROUP_CONCAT(IF(ACTIONTEXT = 'PB', DATETIME, NULL)) AS 'Projektbeginn',
                   GROUP_CONCAT(IF(ACTIONTEXT = 'PE', DATETIME, NULL)) AS 'Projektende'
            FROM geoImportRoot
            GROUP BY DRIVERNAME
           ) A cross join
           (select 1 as n union all select 2) n
    ) t
group by DriverName
于 2013-06-21T13:24:34.650 に答える