2017-10-17 108 views
0

我一直在爲一個項目工作了大約5個星期,現在我一直在做各種各樣的計算器貼子,我幾乎在最後一關。動態數據透視表MYSQL不完整SQL

我有重複的數據搜索每週總結的問題,但我似乎已經想通了,但現在我的聲明沒有完成。 更改編號: Weekly Sum Dynamic Pivot MYSQL

這裏是一個數據的小提琴。 http://sqlfiddle.com/#!9/a3610

$period = 'YEARWEEK'; 


    $sql = " 
    SELECT 
     GROUP_CONCAT(DISTINCT 
     CONCAT(
      'SUM(CASE WHEN (".$period."(date)) = ', 
      (".$period."(date)), 
      ' THEN AMOUNT else 0 END) AS `', 
      (".$period."(date)), 
      '`' 
     ) 
     ORDER BY date ASC) AS `pivot_columns` 
    FROM record_offering 
    WHERE date BETWEEN ? AND ? 
    ORDER BY date ASC 
"; 

$stmt = $pdo->prepare($sql); 
$date_from = '2017-01-01'; 
$date_to = '2017-10-01'; 
$stmt->execute([$date_from, $date_to]); 
$row = $stmt->fetch(); 
$stmt->closeCursor(); 
$pivot_columns = $row['pivot_columns']; 

$sql = " 
    SELECT title AS `Service`, {$pivot_columns} 
    from record_offering t1 
    join setting_service ON t1.service_id = setting_service.id 
    WHERE t1.date BETWEEN ? AND ? 
    GROUP BY title asc WITH ROLLUP 
"; 

$stmt = $pdo->prepare($sql); 
$stmt->execute([$date_from, $date_to]); 
$results = $stmt->fetchAll(); 
$stmt->closeCursor(); 

正如你所看到的最後一個語句不完整:

SELECT title AS `Service`, SUM(CASE WHEN (YEARWEEK(date)) = 201635 THEN AMOUNT else 0 END) AS `201635`, 
SUM(CASE WHEN (YEARWEEK(date)) = 201703 THEN AMOUNT else 0 END) AS `201703`, 
SUM(CASE WHEN (YEARWEEK(date)) = 201709 THEN AMOUNT else 0 END) AS `201709`, 
SUM(CASE WHEN (YEARWEEK(date)) = 201713 THEN AMOUNT else 0 END) AS `201713`, 
SUM(CASE WHEN (YEARWEEK(date)) = 201715 THEN AMOUNT else 0 END) AS `201715`, 
SUM(CASE WHEN (YEARWEEK(date)) = 201717 THEN AMOUNT else 0 END) AS `201717`, 
SUM(CASE WHEN (YEARWEEK(date)) = 201718 THEN AMOUNT else 0 END) AS `201718`, 
SUM(CASE WHEN (YEARWEEK(date)) = 201722 THEN AMOUNT else 0 END) AS `201722`, 
SUM(CASE WHEN (YEARWEEK(date)) = 201723 THEN AMOUNT else 0 END) AS `201723`, 
SUM(CASE WHEN (YEARWEEK(date)) = 201725 THEN AMOUNT else 0 END) AS `201725`, 
SUM(CASE WHEN (YEARWEEK(date)) = 201726 THEN AMOUNT else 0 END) AS `201726`, 
SUM(CASE WHEN (YEARWEEK(date)) = 201735 THEN AMOUNT else 0 END) AS `201735`, 
SUM(CASE WHEN (YEARWEEK(date)) = 201736 THEN AMOUNT else 0 END) AS `201736`, 
SUM(CASE WHEN (YEARWEEK(date)) = 201 
from record_offering t1 
join setting_service ON t1.service_id = setting_service.id 
WHERE t1.`date` BETWEEN ? AND ? 
GROUP BY title asc WITH ROLLUP 

我試圖逃避各種方式查詢,但無論是在查詢完成,我的數據是重複的,或者不完全可以編譯。

+1

認真考慮處理應用程序代碼中的數據顯示問題。它會大量簡化這個查詢。從我的角度來看,你現在的策略是完全回到前面 – Strawberry

+0

我的初始嘗試只是一個基本的總和和組查詢,然後我使用php進行了轉換,但它不會將日常數據彙總到正確的位置。然後我被建議嘗試樞軸 –

+0

當表示層代碼可用時,我無法看到以這種方式旋轉數據的要點。 – Strawberry

回答

2

GROUP_CONCAT有1024字節的限制。

使用

SET SESSION group_concat_max_len = @@max_allowed_packet

的GROUP_CONCAT查詢之前。

+0

對此沒有想法,目前這個項目正在共享主機上運行,​​我相信我需要root權限才能正確使用這個項目。 –

+0

@ Enoch S否你可以在沒有SUPER權限或沒有root權限的情況下使用此設置 –

0

爲了我的思維方式,這個(或者非常喜歡它的東西)就是你所需要的這個問題的所有sql。 一切其他可以,也應該在表示層中處理。

SELECT YEARWEEK(x.date) yw 
    , x.title 
    , COALESCE(SUM(y.amount),0) total 
    FROM setting_service x 
    LEFT 
    JOIN record_offering y 
    ON y.service_id = x.id 
GROUP 
    BY yw 
    , x.id; 
+0

我的初始努力與你所說的一樣。這是我發佈在SA上的問題:https://stackoverflow.com/questions/45267138/datatables-dates-at-the-top-and-data-cells-going-from-left-to-right –

+0

I認爲這看起來更好一些。唯一的問題是'ROLLUP' - 你可以用一點javascript來輕鬆完成。 – Strawberry

+0

這可能已經完成,但問題是它沒有正確彙總數據。 http://www.phpwin.org/s/0xFWpF是小提琴。如果您將thead和tbody時間間隔更改爲+1天,則數據是正確的,但在+1周內它不會聚合,因爲第一個應該是5 –