0

現在、月ごとにデータを合計するmysqlクエリがあります。

    $sql = SELECT SellerName, 
           SUM(IF(ReportMonth = 201201, 1,0)) AS Jan, 
           SUM(IF(ReportMonth = 201202, 1,0)) AS Feb, 
           SUM(IF(ReportMonth = 201203, 1,0)) AS Mar, 
           SUM(IF(ReportMonth = 201204, 1,0)) AS Apr, 
           SUM(IF(ReportMonth = 201205, 1,0)) AS May, 
           SUM(IF(ReportMonth = 201206, 1,0)) AS Jun,
           SUM(IF(ReportMonth = 201207, 1,0)) AS Jul,
           SUM(IF(ReportMonth = 201208, 1,0)) AS Aug,     
           SUM(IF(ReportMonth = 201209, 1,0)) AS Sep,
           SUM(IF(ReportMonth = 201210, 1,0)) AS Oct,      
           SUM(IF(ReportMonth = 201211, 1,0)) AS Nov,    
           COUNT(*) AS YTD
           FROM onlineDATA
           WHERE BuyerZipCode IN ($zips_query) 
           GROUP BY SellerName  

これはうまくいきます。

ただし、月のユーザー入力を許可するように調整する必要があります。つまり、ユーザーは開始月と終了月を選択します。

日付ピッカーデータを既存のyyyymm形式にフォーマットできますが、PHPでクエリを作成して、変動する月と複数の年(たとえば、2012年10月から2013年2月)を調整するにはどうすればよいですか?

ありがとう!

4

2 に答える 2

0

あなたのアプローチは1年間しか機能しません。それ以外の場合、複数の年の月をグループ化したくない場合は、追加の列が必要になります。dateまた、整数値をチェックするのではなく、関数を使用する必要があります(日付をintとして格納しないでください)。

動的なアプローチが必要な場合は、PHP側で動的なクエリの準備を行う必要があります(開始日/終了日を取得してSQLを生成します)。

これがあなたが探している解決策かもしれません:

<?php

$startDate = '201201';
$endDate = '201303';

$formattedStartDate = strtotime( SUBSTR($startDate, 0, 4) . '-' . SUBSTR($startDate, -2, 2) . '-01' );
$formattedEndDate = strtotime( SUBSTR($endDate, 0, 4) . '-' . SUBSTR($endDate, -2, 2) . '-01' );

$sql = "SELECT SellerName, \n";

while ($formattedStartDate <= $formattedEndDate) {
    $sql .= 'SUM(IF(LEFT(ReportMonth, 4) = ' . date('Y', $formattedStartDate) . ' AND RIGHT(ReportMonth, 2) = ' . date('m', $formattedStartDate) . ")) AS '" . date('M Y', $formattedStartDate);

    if($formattedStartDate <> $formattedEndDate) {
        $sql .= "', \n";
    }
    else {
        $sql .= "'\n";
    }

    $formattedStartDate = strtotime('+1 month', $formattedStartDate);
}

$sql .= 'COUNT(*) AS YTD
FROM onlineDATA
WHERE BuyerZipCode IN ($zips_query) 
GROUP BY SellerName';

echo $sql;

結果

セラー名を選択、
SUM(IF(LEFT(ReportMonth、4)= 2012 AND RIGHT(ReportMonth、2)= 01))AS'2012年1月'、
SUM(IF(LEFT(ReportMonth、4)= 2012 AND RIGHT(ReportMonth、2)= 02))AS'2012年2月'、
SUM(IF(LEFT(ReportMonth、4)= 2012 AND RIGHT(ReportMonth、2)= 03))AS'2012年3月'、
SUM(IF(LEFT(ReportMonth、4)= 2012 AND RIGHT(ReportMonth、2)= 04))AS'2012年4月'、
SUM(IF(LEFT(ReportMonth、4)= 2012 AND RIGHT(ReportMonth、2)= 05))AS'2012年5月'、
SUM(IF(LEFT(ReportMonth、4)= 2012 AND RIGHT(ReportMonth、2)= 06))AS'2012年6月'、
SUM(IF(LEFT(ReportMonth、4)= 2012 AND RIGHT(ReportMonth、2)= 07))AS'2012年7月'、
SUM(IF(LEFT(ReportMonth、4)= 2012 AND RIGHT(ReportMonth、2)= 08))AS'2012年8月'、
SUM(IF(LEFT(ReportMonth、4)= 2012 AND RIGHT(ReportMonth、2)= 09))AS'2012年9月'、
SUM(IF(LEFT(ReportMonth、4)= 2012 AND RIGHT(ReportMonth、2)= 10))AS'2012年10月'、
SUM(IF(LEFT(ReportMonth、4)= 2012 AND RIGHT(ReportMonth、2)= 11))AS'2012年11月'、
SUM(IF(LEFT(ReportMonth、4)= 2012 AND RIGHT(ReportMonth、2)= 12))AS'2012年12月'、
SUM(IF(LEFT(ReportMonth、4)= 2013 AND RIGHT(ReportMonth、2)= 01))AS'2013年1月'、
SUM(IF(LEFT(ReportMonth、4)= 2013 AND RIGHT(ReportMonth、2)= 02))AS'2013年2月'、
SUM(IF(LEFT(ReportMonth、4)= 2013 AND RIGHT(ReportMonth、2)= 03))AS'2013年3月'
YTDとしてのCOUNT(*)
onlineDATAから
WHERE BuyerZipCode IN($ zips_query)
GROUP BY SellerName

デモを見る

于 2013-03-11T15:31:14.797 に答える
0

あなたはこれを行うことができるはずです、私はこのような何かが始まりであると確信しています:

SELECT SUM(ReportMonth) FROM SellerName
WHERE BuyerZipCode IN ($zips_query)
AND ReportMonth > '$start_date'
AND ReportMonth < DATE_ADD('$start_date', INTERVAL 1 YEAR)
GROUP BY ReportMonth

例えば

SELECT SUM(ReportMonth) FROM SellerName
WHERE BuyerZipCode IN (1,2,3,4,5,6)
AND ReportMonth > '2013-01-01'
AND ReportMonth < DATE_ADD('2013-01-01', INTERVAL 1 YEAR)
GROUP BY ReportMonth
于 2013-03-11T15:40:36.573 に答える