2

さまざまな製品の毎月の売上概要を作成します。Zane Bien の投稿は、単一の製品に対して 1 つの行を生成するクエリを作成するのに非常に役立ちます。

Income Source  Jan   Feb   Mar   --  Total  Pct  
Report Fees    11285 12745 17980 ... 236970 95.9954

そのクエリは次のとおりです。

SELECT "Report Fees" AS `Income Source`, 
SUM( IF( MONTH( b.ord_billed_time ) =1, b.ord_fee_report, 0 ) ) AS Jan, 
SUM( IF( MONTH( b.ord_billed_time ) =2, b.ord_fee_report, 0 ) ) AS Feb, 
SUM( IF( MONTH( b.ord_billed_time ) =3, b.ord_fee_report, 0 ) ) AS Mar, 
"..." AS `--` , 
SUM( b.ord_fee_report ) AS Total, 
AVG( b.ord_fee_report / b.ord_fee_total ) *100 AS Pct
FROM orders b
WHERE b.ord_billed_time IS NOT NULL 
AND b.ord_cancelled_time IS NULL 
AND b.ord_fee_report IS NOT NULL 
AND year( b.ord_billed_time ) = 2012
AND b.clientID = 8 

この単一のクエリを拡張して、収入の種類ごとに 1 行ずつ、合計 8 行を取得する方法はありますか? このようなもの:

Income Source  Jan   Feb   Mar   --  Total  Pct  
Report Fees    11285 12745 17980 ... 236970 95.9954
Income Type2    5401  3320  1394 ...  13456  0.321
Income Type3      98   421    14 ...   1102  0.001
...
Total         333333 22222 11111 ... 9999999 100.0

収入の種類は、orders テーブルの個別の列 (ord_fee_x、ord_fee_y、ord_fee_z など) に格納されます。

現在、8 つのクエリを実行し、結果を配列にロードして、その配列から表示しています。一度にすべてのデータを取得し、返された行ごとに表示する方が効率的です。

それを行う方法はありますか?

4

2 に答える 2

0

操作により可能UNIONです。理想的にはUNION ALL、クエリが各収入源のカスタム計算に基づいて独自の結果を生成するように見えるため、状況に合わせて を使用する必要があります。重複行を除外するUNION ALLと比較して間違いなく高速なすべての行が含まれます。UNION

言い換えると:

(SELECT "Report Fees" AS `Income Source`, 
SUM( IF( MONTH( b.ord_billed_time ) =1, b.ord_fee_report, 0 ) ) AS Jan, 
SUM( IF( MONTH( b.ord_billed_time ) =2, b.ord_fee_report, 0 ) ) AS Feb, 
SUM( IF( MONTH( b.ord_billed_time ) =3, b.ord_fee_report, 0 ) ) AS Mar, 
"..." AS `--` , 
SUM( b.ord_fee_report ) AS Total, 
AVG( b.ord_fee_report / b.ord_fee_total ) *100 AS Pct
FROM orders b
WHERE b.ord_billed_time IS NOT NULL 
AND b.ord_cancelled_time IS NULL 
AND b.ord_fee_report IS NOT NULL 
AND year( b.ord_billed_time ) = 2012
AND b.clientID = 8)
UNION ALL
(... query 2 ...)
UNION ALL
(... query 3 ...)

など。

参考http ://dev.mysql.com/doc/refman/5.0/en/union.html

于 2013-04-27T05:54:33.577 に答える