1

編集する必要があるクエリがあります。現在、2 列のデータ、ケース ラベル、および昨日から始まる過去 7 日間に処理されたカウント (またはケースの総数) を返します。この出力を変更して、出力に 6 つのラベルのみが含まれるようにする必要があります (つまり、常に 6 行のデータ)。これらの行は、上位 5 つのラベルである必要があり、残りのラベルの合計が 6 番目のラベル (「その他」と呼ばれる) である必要があります。これは、この出力が Web ベースのプラットフォームでデータを表示する PHP スクリプトに送られるためです。

最後に、ここで説明するために、必要な出力の表と以下のクエリを示します。

+-----------+---------------+  
| CaseLabel | CasesResolved |  
+-----------+---------------+  
| Label1    |            20 |  
| Label2    |            18 |
| Label3    |            10 |
| Label4    |             9 |
| Label5    |             7 |
| Other     |            12 |
+-----------+---------------+

助けてくれてありがとう!:-)

MySQL 5.096 の実行

MySQL コード:

SELECT
    deskcases.Labels,
    COUNT(deskcases.Labels)AS CaseCount
FROM
    deskcases
WHERE
    deskcases.Labels NOT LIKE ''
AND deskcases.Labels NOT LIKE '%SPAM%'
AND deskcases.Labels NOT LIKE '%Online Orders%'
AND deskcases.Labels NOT LIKE '%Internal SPAM%'
AND deskcases.`Case Status` LIKE 'Resolved'
AND deskcases.`Resolved At` > CURDATE()- INTERVAL 7 DAY
GROUP BY
    deskcases.Labels
ORDER BY
    CaseCount DESC
4

2 に答える 2

2

MySQL では、おそらくこれを表現する最も簡単な方法は、一時テーブルを使用することです。

create temporary table temp as (
    id int not null auto_increment,
    CaseLabel varchar(255),
    CasesResolved int
);

insert into temp(CaseLabel, CasesResolved)
    SELECT deskcases.Labels, COUNT(deskcases.Labels)AS CaseCount
    FROM deskcases
    WHERE deskcases.Labels NOT LIKE ''
          AND deskcases.Labels NOT LIKE '%SPAM%'
          AND deskcases.Labels NOT LIKE '%Online Orders%'
          AND deskcases.Labels NOT LIKE '%Internal SPAM%'
          AND deskcases.`Case Status` LIKE 'Resolved'
          AND deskcases.`Resolved At` > CURDATE()- INTERVAL 7 DAY
    GROUP BY deskcases.Labels
    ORDER BY CaseCount DESC;

select (case when id <= 5 then caselabel else 'Other' end),
       SUM(casesResolved) as CasesResolved
from temp
group by (case when id <= 5 then caselabel else 'Other' end)
order by MAX(id) desc

一時テーブルのid列は、各行に行番号を追加します。他の実際のデータベースではrow_number()関数を使用しますが、MySQL はそれをサポートしていません。

于 2013-03-20T19:03:58.063 に答える
-1

考えられるオプションの 1 つは、ランク変数を使用することです。

ダミー結合はランクを初期化し、if は最大 6 までカウントされます。
このすべてのものは最初に内部クエリで解決され、次のようなものが生成されます。

| Label1    |            20 |  
| Label2    |            18 |
| Label3    |            10 |
| Label4    |             9 |
| Label5    |             7 |
| Label6    |            12 |
| Label7    |               |
| ......

他のクエリは、これを目的の出力にまとめます。

select if(rank=6,"Other",sub.Labels) as Label, SUM(sub.CaseCount) from (
    SELECT
        if(@Rank < 6,@Rank:= @Rank + 1, @Rank) as Rank
        ,deskcases.Labels
        ,COUNT(deskcases.Labels) AS CaseCount
    FROM
        deskcases
    JOIN (@rank:= 0)
    WHERE
        deskcases.Labels NOT LIKE ''
    AND deskcases.Labels NOT LIKE '%SPAM%'
    AND deskcases.Labels NOT LIKE '%Online Orders%'
    AND deskcases.Labels NOT LIKE '%Internal SPAM%'
    AND deskcases.`Case Status` LIKE 'Resolved'
    AND deskcases.`Resolved At` > CURDATE()- INTERVAL 7 DAY
    GROUP BY
        deskcases.Labels
    ORDER BY
        CaseCount DESC
) sub
group by sub.rank ASC

labelx最後の行の を「その他」に置き換えます。

于 2013-03-20T18:42:24.763 に答える