4

次のスキーマを持つテーブルがあります。

DATA | CAUSE_1 | TIME_1 | CAUSE_2 | TIME_2 | CAUSE_3 | TIME_3

CAUSE.*フィールド(VarChar)には文字列を含めることはできません。含める場合、フィールドはTIME.*0です。

クエリを作成しようとしていますが、残念ながら成功せず、結果が次の形式で表示されます。

CAUSE | TOT_TIME | N_RIPET_CAUSE,

どこ:

  • CAUSE含まれているもののリストがありますCAUSE_1 ... CAUSE_3
  • TOT_TIMEの値の合計ではTIME_1 ... TIME_3
  • 各のN_RIPET_CAUSE繰り返しの数で。CAUSE

説明したいと思います。

4

4 に答える 4

3

テーブル構造を変更できない場合、この結果を得るには、列を行にピボット解除する必要があります。

MySQLにはunpivot関数はありませんが、これはUNION ALLクエリを使用して実行できます。次に、これらの値に集計を適用して、最終結果を取得できます。

select cause, sum(time) Tot_time, count(cause) N_Ripet_Cause
from
(
  select data, cause_1 as cause, time_1 as time
  from yourtable
  union all
  select data, cause_2 as cause, time_2 as time
  from yourtable
  union all
  select data, cause_3 as cause, time_3 as time
  from yourtable
) src
group by cause
于 2013-02-10T15:01:30.977 に答える
3

これを試して

 SELECT DATA ,CAUSE , TOT_TIME , N_RIPET_CAUSE
 FROM ( select DATA, CONCAT(`CAUSE_1`,' ',`CAUSE_2`, ' ', `CAUSE_3`) as CAUSE ,
 sum(`TIME_1` + `TIME_2` +`TIME_3`) as TOT_TIME ,
 (count(`CAUSE_1`)+count(`CAUSE_2`)+count(`CAUSE_3`)) as N_RIPET_CAUSE
 FROM your_table
 group by DATA
 ) t

SQLFIDDLEデモを見る

編集。

これを試して

     ( select DATA , `CAUSE_1` as CAUSE ,
     sum(`TIME_1` + `TIME_2` +`TIME_3`) as TOT_TIME ,
     (count(`CAUSE_1`)+count(`CAUSE_2`)+count(`CAUSE_3`)) as N_RIPET_CAUSE
     FROM Table1 
    group by DATA)
  union all
    (select DATA , `CAUSE_2` as CAUSE ,
    sum(`TIME_1` + `TIME_2` +`TIME_3`) as TOT_TIME ,
    (count(`CAUSE_1`)+count(`CAUSE_2`)+count(`CAUSE_3`)) as N_RIPET_CAUSE
    FROM Table1
    group by DATA   )
  union all

    (select DATA , `CAUSE_3` as CAUSE ,
    sum(`TIME_1` + `TIME_2` +`TIME_3`) as TOT_TIME ,
    (count(`CAUSE_1`)+count(`CAUSE_2`)+count(`CAUSE_3`)) as N_RIPET_CAUSE
    FROM Table1
    group by DATA   )

SQLデモはこちら

編集:

あなたの必要性のためにこれを試してください

 select cause, sum(time) Tot_time, count(cause) N_Ripet_Cause
 from(
    select  cause_1 as cause, time_1 as time
    from Table1
    union all
    select  cause_2 as cause, time_2 as time
   from Table1
   union all
   select  cause_3 as cause, time_3 as time
   from Table1
 ) t
 group by cause

デモSQLフィドル

于 2013-02-10T15:06:23.363 に答える
2

次のように、ユニオンから選択することができます。

select * from
(
    select cause_1 as cause, time_1 as time from tableName
    union
    select cause_2 as cause, time_2 as time from tableName
    union
    select cause_3 as cause, time_3 as time from tableName
) as joinedValues

次に、その選択から任意のアクションを実行できます。各節の同様の数:

select cause, count(cause) from
(
...
) as joinedValues
group by cause
于 2013-02-10T14:59:24.630 に答える
0

ジャックは的を射ています-テーブル構造に冗長なセルが多すぎる可能性があります。リレーションを使用して、そのような発生を排除します。

DataTable dID | データ

instanceTable ID | dID | 原因| 時間

次に、2つのテーブルでNATURAL JOINを使用して、情報を抽出します。

SELECT * FROM DataTable NATURAL JOIN instancesTable WHERE dID=? LIMIT 3

このクエリは、最初のテーブルの「データ」のIDで発生した原因と時刻のリストを返します。

編集:* N_RIPET_CAUSE *は、dIDのSUM(CAUSE)を使用して見つけることができます。

于 2013-02-10T14:53:53.533 に答える