2013-06-27 60 views
0

我有一個sql查詢,輸出大量的信息。我需要做的是分組並彙總輸出表中的信息。這裏是我想要做的一個例子:如何分組表格行並在組上方添加彙總行?

name  val1 val2 val3 total Run 
some name 18  4  1  23  
some name 5  4  1  23  2 
some name 13  8  2  23  1 
other name 2  2  0  4  1 
and name  2  42  1  45  1 

是來自數據庫中的名字可以出現更多然後一次。如果是這樣我組的項目一起,並添加摘要行上方將具有相同的名稱,但也計算總計:

  • VAL1有加在一起
  • VAL2,VAL3必須是相同的在RUN單元中具有最大值的行
  • 總值始終保持不變。

在輸出表中會出現多次這樣的分組。 我試圖谷歌我的問題,但最接近,我得到了我所尋找的是這樣的:How to add rows in middle of a table with jQuery? 這不是我真的在做什麼。

我不知道是否有一個sql命令可以用來做到這一點,或者如果它可以在PHP或使用jQuery的。任何建議將不勝感激。

謝謝!

更新:

我已經在SQL中使用GROUP BY試過了,但它給了我語法錯誤:

SELECT name, val1, val2, val2, run 
FROM tableName 
WHERE ... ORDER BY name DESC GROUP BY name 

(不介意WHERE ...其實我有報表存在)。 當查詢中有兩個或三個結果並且所有三個結果都具有相同名稱時,它實際上將查詢分組的唯一時間。所以我雖然GROUP BY不是選項。

在PHP中,我將名稱存儲到變量中,並檢查名稱是否相同。如果它不是相同的我添加大師班的行,如果不是類是孩子,這有助於我分組。但是我沒有想出一種方法來添加上面的彙總行。

我一直在想,每當名稱發生變化時,添加一個空白行並使用jquery在頁面加載後填充它,但是,一次名稱的發生我不需要總結。

至於在總結行中的Val3,我已經在上面進行了更改。 Val3將與具有最大運行值的行中的val3相同。我想我被我自己的例子弄糊塗了。

我希望這些信息更有幫助。

+0

這一切都很好 - 但你嘗試過什麼解決比谷歌它的其他問題了嗎?你有開始開發的SQL,PHP或JQuery,但後來被卡住了?向我們展示一些東西,幫助你會更容易。 – 2013-06-27 18:22:33

+0

我可以理解你對val1和val2的意思,但我不明白val3。你在減去什麼,你從中減去了什麼? – wwv

+0

感謝您的評論,我已添加上述更改。 – Hesh

回答

0

無論何時我需要做這樣的事情,我都會使用多維關聯數組,頂級鍵是我想要做的最高級別的分組。在你的情況下,這將是「名稱」。

在該數組的每個元素中,還有另一個assoc數組,每個值都需要跟蹤一個值。還有一個編號的子數組,它將包含屬於該組的每個單獨的行。

在我完成所有行的檢查之後,我會遍歷所生成的關聯數組並打印結果。

例如:

<?php 

/** Simulate of the results of your SQL query **/ 
$sql_result = array(
    array("name"=>"some name ", "val1"=>5, "val2"=>4, "val3"=>1, "run" =>2), 
    array("name"=>"some name ", "val1"=>13, "val2"=>8, "val3"=>2, "run" =>1), 
    array("name"=>"other name", "val1"=>2, "val2"=>2, "val3"=>0, "run" =>1), 
    array("name"=>"and name", "val1"=>2, "val2"=>42, "val3"=>1, "run" =>1) 
); 

/** Add each result to your assoc array **/ 
$names = array(); 
foreach($sql_result as $row) { 
    $name = $row["name"]; 

    // Create a new assoc array for each different name 
    if(!$names[$name]) { 
     $names[ $name ] = array(
      "name"  => $row["name"], 
      "max_run" => $row["run"], 
      "val1"  => $row["val1"], 
      "val2"  => $row["val2"], 
      "val3"  => $row["val3"], 
      "runs"  => array($row) 
     ); 
     continue; 
    } 

    // Update the necessary values for the highest "run" number 
    if ($row["run"] > $names[ $name ]["max_run"]) { 
     $names[ $name ]["max_run"] = $row["run"]; 
     $names[ $name ]["val2"] = $row["val2"]; 
     $names[ $name ]["val3"] = $row["val3"]; 
    } 

    // Update the reset of the values 
    $names[ $name ]["val1"]  += $row["val1"]; 
    $names[ $name ]["total"] = $names[ $name ]["val1"] + $names[ $name ]["val2"] + $names[ $name ]["val3"]; 
    $names[ $name ]["runs"][] = $row; 

} 

/** Print your results **/ 
foreach ($names as $name) { 
    // Print your totals here like $name["total"], $name["val1"] 
    echo $name["name"]." "; 
    echo $name["val1"]." "; 
    echo $name["val2"]." "; 
    echo $name["val3"]." "; 
    echo $name["total"]."<br>"; 
    if (count($name["runs"]) > 1) { 
     foreach($name["runs"] as $run) { 
      echo print_r($run)."<br>"; 
     } 
    } 
    echo "<hr>"; 
} 

?> 

此代碼測試

+0

謝謝JJS,這是一個很好的方法。我正在考慮將它存儲到數組中,但不想佔用額外的內存,因爲通常我會至少有100個查詢結果。你認爲有一種方法可以避免數組嗎?如果沒有,我會繼續這個實現 – Hesh

+0

有人比我更聰明可能會發布一些東西,但我能想到的唯一的其他方式是SQL中的一些子查詢。 assoc數組方法是我使用很多的方法,即使waaay超過100個結果,我也沒有遇到任何問題。 – wwv

+0

非常感謝您的幫助。對此,我真的非常感激!再次感謝! – Hesh