0

レポート ツールで mysql を使用しています。いくつかのクエリを入力してから一時テーブルのデータを表示する一時テーブルがあります。

私のテーブル構造は

Prim_key    starttime             endtime          timediff
1       2012-07-20 00:00:0    2012-07-22 10:55:32   39332
2       2012-07-20 04:50:13   2012-07-22 10:55:32   158719
3       2012-07-20 10:00:00   2012-07-22 00:00:05   5

タイミングのパーセンテージ < 30 、30-45 と > 45 の間のテーブルを表示する必要があります。次のクエリを作成しましたが、ステータス 1137 のエラーが発生します - テーブルを再開できません: 't_results'

Expected result:

|   % of less than 30 min   | % of between 30 - 45 |    % of greater than 45 mins |

クエリは

SELECT prim_key key, (
  SELECT count(*)*100 / (
      SELECT count(*)
      FROM t_results 
      WHERE timediff > 0 )
  FROM   t_results 
  WHERE  (timediff /60)  < 30
  ) less30, (
  SELECT count(*)*100 / (
     SELECT count(*)
     FROM t_results 
     WHERE timediff > 0 )
  FROM   t_results 
  WHERE  (timediff /60)  >=  30  and (timediff /60)  <=  45 
  ) bet3045, 
  (SELECT count(*)*100 / (
      SELECT count(*)
      FROM t_results 
     WHERE timediff > 0 ) 
  FROM t_results 
  WHERE  (timediff /60)  > 45 
 )  great45 
FROM t_results 
WHERE 1 = 1 AND 1 =1 
GROUP BY prim_key

それを書く別の方法はありますか?

4

2 に答える 2

2

一時テーブルは、同じクエリ内で 2 回参照することはできません。

http://bugs.mysql.com/bug.php?id=10327

編集

実際、少し考えてみると (ピボットが必要なので)、クエリは次の形式になると思います

(2番目の編集、パーセンテージでフォーマットする)

SET @numRows := (SELECT COUNT(*) FROM t_results WHERE timediff > 0 );
SELECT COUNT(CASE WHEN (timediff /60)  < 30 THEN timediff ELSE NUll END) * 100 /@numRows  less30, 
    COUNT(CASE WHEN (timediff /60)  >=  30  and (timediff /60)  <=  45  THEN timediff ELSE NUll END) * 100 /@numRows bet3045, 
    COUNT(CASE WHEN (timediff /60)  > 45  THEN timediff ELSE NUll END) * 100 /@numRows great45 
FROM t_results WHERE timediff > 0 

トリックを行う必要があります。私がかなりばかげた間違いを犯していない限り。私が通常行うこと:)

于 2012-09-10T11:45:55.783 に答える
1

@ user1051643 は正しいです。クエリで一時テーブルを複数回使用することはできません。残念、遅刻などですが、それはそれです。

とはいえ、クエリで何を達成しようとしていますか? 非常に奇妙に感じるのは、メイン クエリが GROUP BY prim_key を実行することです。prim_key が主キーであり、クエリに結合がないと仮定すると、GROUP BY クエリの結果の概念的な主キーは常に GROUP BY リストの列によって正確に定義されるため、これは冗長であるように思われます。つまり、GROUP BY は冗長です。

次に、SELECT リストで、t_results に対して一連の集計クエリを実行しますが、メイン クエリの現在の行と相関しているようには見えません。これは、パフォーマンスを損なうことなく、一連の個別のクエリに簡単に書き直すことができることを意味します。しかし、何よりも、解決したい問題を十分に正確に定義していないと思います。

アップデート:

select 100 * sum(
                 if (timediff < 30*60, 1, 0)
             ) / count(timediff)  
       AS "% of less than 30 min"
,      100 * sum(
                 if (timediff between 30*60 and 45*60, 1, 0)
             ) / count(timediff)  
       AS "% of between 30 - 45"
,      100 * sum(
                 if (timediff > 45*60, 1, 0)
             ) / count(timediff) 
       AS "% of greater than 45 mins"
from   t_results
于 2012-09-10T12:10:37.260 に答える