2016-05-05 6 views
3

私はいくつかのレポートを作成する必要があるいくつかのデータをmysqlに持っています。私のデータは、次のクエリから来ている :日付と合計でmysql結果をピボット

SELECT StoreNbr,StoreName,Date, SUM(`Sales`) FROM sales_tbl GROUP BY StoreNbr,StoreName,Date; 

これは、次のデータ(私の例のためだけの小さなサブセット)になり:

+-----------+---------------------------+----------------------------+ 
| StoreNbr | StoreName    | Date  | SUM(Sales)  | 
+-----------+---------------------------+----------------------------+ 
|  1112 | Store1    | 2016-01-16 |   115.09 | 
|  1112 | Store1    | 2016-01-17 |    81.00 | 
|  1113 | Store2    | 2016-01-16 |   112.44 | 
|  1113 | Store2    | 2016-01-17 |    56.61 | 

私はこのように私のデータを変換したいです方法:

+-----------+---------------------------+----------------------------+ 
| StoreNbr | StoreName    | 2016-01-16  | 2016-01-17 | 
+-----------+---------------------------+----------------------------+ 
|  1112 | Store1    | 115.09   |  81.00 | 
|  1113 | Store2    | 112.44   |  56.61 | 

は明らかにこのように実行される可能性があります行(店舗)と私のクエリとしてクエリで返される日付の未知数の数千人があるかもしれません(この意志

SELECT StoreNbr,StoreName,Date, SUM(`Sales`) FROM sales_tbl WHERE (Date BETWEEN '2016-01-10' AND '2016-05-10') GROUP BY StoreNbr,StoreName,Date; 

これを行うにはいくつかの方法がありますが、どれも非常に単純ではありません。私はいくつかの調査を行いましたが、mysqlがピボッティングをサポートしていないという記述がいくつかあります。私はmariadbを実行していますが、mariadbは接続エンジンを介してピボットすることをサポートしています。私はそれを働かせることができませんでした(私のデータの公式の例を調整する)。 もう1つの方法はIFとケースですが、私が見いだしている答えのほとんどは、適応するのが非常に困難であるか、または質問する人に提供されるデータにのみ調整されています。 もう1つのアプローチは、データテーブルをフィードするエンドのjsonレスポンスを持っているので、配列上にデータが出力されるときにデータを処理することです。 - これはまだ私が把握できなかったと思う別のものです。

私は希望の出力を日付の量に依存しないようにする方法を探しています(そして、私は日付が週何か他のものに置き換えられるかもしれないと思います)。誰も助けることができますか?

$dateIndexedArray = array(); 
while($row = $stmt1->fetch(PDO::FETCH_ASSOC) { 
    $dateIndexedArray[$row['Date']] = 0; 
} 

ARRYがあなたを実行し

[ 
    '2016-01-16' => 0, 
    '2016-01-17' => 0 
] 

次のようになります。

+2

これは本当に素晴らしいレポートを提供することはできませんが、最も簡単な解決策はおそらくあなたのタグにリストされているPHPを使用することでしょう。 –

+0

私は知っている!私はちょうど企業のニーズを実行しています:)そのマーケティングは5日間以上の店舗のパフォーマンスを見たいかもしれませんが、このデータは、画面上のグラフや輸出後にうまく使用することができます。 –

+2

SQLは実際には良い報告言語ではありません。これは優れたデータ抽出言語です。ですから、現在のクエリを保存し、PHPなどの別の言語でレポートを作成する必要があります。 –

答えて

1

SELECT DISTINCT Date 
FROM sales_tbl 
WHERE (Date BETWEEN '2016-01-10' AND '2016-05-10') 
ORDER BY Date; 

すべての明確な日数を選択し、そのことでインデックスされる配列を初期化するには、ゼロを保存する日付クエリ

SELECT StoreNbr, StoreName,Date, SUM(`Sales`) AS Sales 
FROM sales_tbl 
WHERE (Date BETWEEN '2016-01-10' AND '2016-05-10') 
GROUP BY StoreNbr,StoreName,Date; 

そして$report配列は次のようになります

$report = array(); 
while($row = $stmt2->fetch(PDO::FETCH_ASSOC)){ 
    $storeIndex = $row['StoreNbr'] . ':' . $row['StoreName']; 
    if (!isset($report[$storeIndex])) { 
     $report[$storeIndex] = array(
      'StoreNbr' => $row['StoreNbr'], 
      'StoreName' => $row['StoreName'], 
      'Sales' => $dateIndexedArray 
     ); 
    } 
    $report[$storeIndex]['Sales'][$row['Date']] = $row['Sales']; 
} 

店舗当たり日付インデックスとする配列で "売上高" を記憶:

[ 
    '1112:Store1' => [ 
     'StoreNbr' => 1112, 
     'StoreName' => 'Store1', 
     'Sales' => [ 
      '2016-01-16' => 115.09, 
      '2016-01-17' => 81.00 
     ] 
    ], 
    '1113:Store2' => [ 
     'StoreNbr' => 1113, 
     'StoreName' => 'Store2', 
     'Sales' => [ 
      '2016-01-16' => 112.44, 
      '2016-01-17' => 56.61 
     ] 
    ] 
] 

更新: あなたはに、すべてのデータが必要な場合店舗ごとに1行にすると、コードを変更することができます。

$report = array(); 
while($row = $stmt2->fetch(PDO::FETCH_ASSOC)){ 
    $storeIndex = $row['StoreNbr'] . ':' . $row['StoreName']; 
    if (!isset($report[$storeIndex])) { 
     $report[$storeIndex] = $dateIndexedArray; 
     $report[$storeIndex]['StoreNbr'] = $row['StoreNbr']; 
     $report[$storeIndex]['StoreName'] = $row['StoreName']; 
    } 
    $report[$storeIndex][$row['Date']] = $row['Sales']; 
} 

結果の配列は次のようになります。アップデート2

[ 
    '1112:Store1' => [ 
     'StoreNbr' => 1112, 
     'StoreName' => 'Store1' 
     '2016-01-16' => 115.09, 
     '2016-01-17' => 81. 
    ], 
    '1113:Store2' => [ 
     'StoreNbr' => 1113, 
     'StoreName' => 'Store2', 
     '2016-01-16' => 112.44, 
     '2016-01-17' => 56.61 
    ] 
] 

:あなたはWITH ROLLUP

SELECT StoreNbr, StoreName,Date, SUM(`Sales`) AS Sales 
FROM sales_tbl 
WHERE (Date BETWEEN '2016-01-10' AND '2016-05-10') 
GROUP BY StoreNbr,StoreName,Date WITH ROLLUP; 
$report = array(); 
while($row = $stmt2->fetch(PDO::FETCH_ASSOC)){ 
    if ($row['StoreName'] === null) { 
     // Skip this row. 
     // It contains total sales grouped by StoreNbr 
     // (or not grouped if StoreNbr === null). 
     continue; 
    } 
    $storeIndex = $row['StoreNbr'] . ':' . $row['StoreName']; 
    if (!isset($report[$storeIndex])) { 
     $report[$storeIndex] = $dateIndexedArray; 
     $report[$storeIndex]['StoreNbr'] = $row['StoreNbr']; 
     $report[$storeIndex]['StoreName'] = $row['StoreName']; 
    } 
    if ($row['Date'] === null) { 
     // This row contains total sales grouped by StoreNbr & StoreName 
     $report[$storeIndex]['TotalSales'] = $row['Sales'] 
    } else { 
     $report[$storeIndex][$row['Date']] = $row['Sales']; 
    } 
} 

を使用することができます店あたりの売上合計を取得するには私は決してきませんのでご了承くださいused WITH ROLLUPコードを調整する必要があるかもしれません。

+0

ありがとうございました!このループで合計を得ることができますか? [StoreName] => 'Store2'、 '2016-01-16' => 112.44、 '2016-01-17' = '012' > 56.61、 '合計' => 169.05 –

+1

@IoannisKokkinis、アップデートを確認してください。私はそれを試したことがないので、あなたは私にそれをテストした後、私にいくつかのフィードバックを与えるといいだろう。 –

+0

このROLUPは驚くべきものです。それは、それが節の項目によってグループと同じくらい多くのNULL行を取得することです。私はそれに取り組んでおり、準備ができたら戻ってくるでしょう。 –

関連する問題