2016-09-15 12 views
1

月にデータベース内のClientCostToDate行(タイプはDECIMAL)をすべて追加し、JSONとしてデータを返すMySQLクエリがあります。MySQLデータベースの列の値をカウントするクエリ

私のPHPスクリプトは次のとおりです。ここで

//the sql query to be executed 
$estimates_query = "SELECT DATE_FORMAT(CreatedDate, '%M %Y') AS CreatedMonth, 
SUM(ClientCostToDate) AS ClientCostsTotal, 
EXTRACT(YEAR_MONTH FROM CreatedDate) AS CreatedYearMonth 
FROM Estimates 
WHERE CreatedDate IS NOT NULL 
AND EXTRACT(YEAR_MONTH FROM CreatedDate) >= EXTRACT(YEAR_MONTH FROM CURDATE())-100 
GROUP BY DATE_FORMAT(CreatedDate, '%M') 
ORDER BY CreatedYearMonth"; 

//storing the result of the executed query 
$result = $conn->query($estimates_query); 

//initialize the array to store the processed data 
$estimatesJsonArray = array(); 

//check if there is any data returned by the sql query 
if ($result->num_rows > 0) { 
//converting the results into an associative array 
while ($row = $result->fetch_assoc()) { 
$jsonArrayItem = array(); 
$jsonArrayItem['date'] = $row['CreatedMonth']; 
$jsonArrayItem['clientCostsTotal'] = $row['ClientCostsTotal']; 
//append the above created object into the main array 
array_push($estimatesJsonArray, $jsonArrayItem); 
} 
} 

//close the connection to the database 
$conn->close(); 

//set the response content type as json 
header('Content-type: application/json'); 
//output the return value of json encode using the echo function 
echo json_encode($estimatesJsonArray, JSON_PRETTY_PRINT); 

はJSONです:

[ 
{ 
    "date": "February 2016", 
    "clientCostsTotal": "21211.25" 
}, 
{ 
    "date": "March 2016", 
    "clientCostsTotal": "206996.25" 
}, 
{ 
    "date": "April 2016", 
    "clientCostsTotal": "74667.50" 
}, 
{ 
    "date": "May 2016", 
    "clientCostsTotal": "61128.75" 
}, 
{ 
    "date": "June 2016", 
    "clientCostsTotal": "267740.50" 
}, 
{ 
    "date": "July 2016", 
    "clientCostsTotal": "200946.75" 
}, 
{ 
    "date": "August 2016", 
    "clientCostsTotal": "0.00" 
} 
] 

MySQLデータベースStatusVARCHARタイプ)内の別の列があります。これは、以下の値で構成されます。新規見積もり、承認済み、請求済、請求待ち、キャンセル、クライアントあり、原価提出。

SUM(ClientCostToDate) AS ClientCostsTotalを構成する行のすべてのステータスを取得するMySQLクエリを作成する必要があります。その後、1か月ごとにステータスの新しいタイプ(新規見積もり、承認済み、請求済み、請求待ち、キャンセル済み、クライアントあり、原価提出済み)の数をカウントする必要があります。これを達成する最良の方法は何ですか?

答えて

2

あなたは条件付き集約を使用して、別の列にそれぞれの値を入れることができます。

SELECT DATE_FORMAT(CreatedDate, '%M %Y') AS CreatedMonth, 
     SUM(ClientCostToDate) AS ClientCostsTotal, 
     SUM(status = 'New Estimate') as num_NewEstimate, 
     SUM(status = 'Approved') as num_Approved, 
     . . . 
FROM Estimates 
WHERE CreatedDate IS NOT NULL AND 
     EXTRACT(YEAR_MONTH FROM CreatedDate) >= EXTRACT(YEAR_MONTH FROM CURDATE())-100 
GROUP BY DATE_FORMAT(CreatedDate, '%M %Y') 
ORDER BY CreatedYearMonth; 
+0

ありがとうございました。それはまさに私が好きなように動作します。すべての 'Status'値の総数を取得するには、' SUM(num_NewEstimate、num_Approved、...) 'を実行しますか?それがパズルのその部分を達成する最善の方法ですか? – Liz

+1

@LizBanach:MySQLでは、同じクエリのSELECTリスト内で列エイリアスを参照することはできません。この問合せをインライン・ビュー(必要なパフォーマンス・ペナルティを伴う)にして、外部問合せの列名を参照できます。または、1)同じ式を繰り返します(個々の数を取得する)が、コンマ区切りの代わりに加算演算子(+)を組み合わせる。または2)すべての値 'SUM(status IN( 'New Estimate'、 'Approved'、...))AS num_in_status_list'をテストする別の式を実行します。 – spencer7593

+0

ガイダンス@ spencer7593ありがとうございました – Liz

関連する問題