2016-10-26 6 views
0

2つのテーブルから列データを取り出し、その結果をエイリアスとして保存して計算結果を別のエイリアスに集計する必要がありますPHPのテーブルで。私は私のSELECTステートメント内に派生テーブルを作成することでこれを達成しようとしていますが、動作しません。エラーは発生しませんが、テーブルには列ヘッダーのみが表示されます。派生テーブルから列を引き出し、1つのMySQL SELECT文で合計する

CODE:

$sql = "SELECT x.company, x.stagestatus, x.shippeddate, SUM(x.totprice) as totalprice, SUM(x.sgtotquantity) as sgtotqty, SUM(x.sgtotalsqft) as sgtotsqft, SUM(x.avgsqftrev) as avgsqftrevenue, SUM(x.avgunitrev) as avgunitrevenue FROM (SELECT t1.company, t1.stagestatus, t1.shippeddate, t1.id, FORMAT(TRIM(LEADING '$' FROM t1.totalprice), 2) AS totprice, t2.invoiceid, SUM(t2.quantity) AS sgtotqauntity, FORMAT(SUM(t2.width * t2.height * t2.quantity) /144, 2) AS sgtotalsqft, FORMAT((TRIM(LEADING '$' FROM t1.totalprice)/(SUM(t2.width * t2.height * t2.quantity) /144)), 2) as avgsqftrev, FORMAT((TRIM(LEADING '$' FROM t1.totalprice)/SUM(t2.quantity)), 2) AS avgunitrev 
    FROM invoices AS t1 INNER JOIN lineitems AS t2 ON t1.id = t2.invoiceid 
    WHERE (t2.invoiceid = t1.id) 
    GROUP BY t1.id) x 
WHERE x.stagestatus='Complete' 
GROUP BY x.company ASC"; 

このコードブレークが、私は個別に小さな部分を使用する場合、それは大丈夫動作します。

EX:

$sql="SELECT invoices.id, invoices.orderdate, invoices.stagestatus, FORMAT(TRIM(LEADING '$' FROM invoices.totalprice), 2) AS totalprice, clients.company, lineitems.invoiceid, SUM(lineitems.quantity) AS sgtotqty, FORMAT(SUM(lineitems.width * lineitems.height * lineitems.quantity) /144, 2) AS sgtotsqft, FORMAT((TRIM(LEADING '$' FROM invoices.totalprice)/(SUM(lineitems.width * lineitems.height * lineitems.quantity) /144)), 2) as avgsqftrevenue, FORMAT((TRIM(LEADING '$' FROM invoices.totalprice)/SUM(lineitems.quantity)), 2) AS avgunitrevenue 
FROM clients 
INNER JOIN invoices ON clients.id = invoices.clientid 
INNER JOIN lineitems ON invoices.id = lineitems.invoiceid 
WHERE (lineitems.invoiceid = invoices.id) AND invoices.orderdate BETWEEN '".$revenuefrom."' AND '".$revenueto."' AND invoices.stagestatus IN (". implode(',', array_map(function($item) {return '"' . $item . '"'; }, $revenue_check)) .") 
GROUP BY invoices.id DESC"; 

このコードはinvoices.idにより、すべてのデータをうまく機能し、グループ。しかし、プロジェクトのニーズが調整され、すべてがinvoices.companyによってグループ化されなければなりません。 invoices.idの代わりにinvoices.companyでグループ化しようとすると、私のテーブルは完成しますが、各社の行の値は非常に不正確です(sum()は正しくありません)。テーブルが構築されている

PHPコード:

$result = $conn->query($sql); 


    echo "<table id='revenueReportA' align='center' class='report_DT'> 
    <thead> 
    <tr> 

    <th>Customer</th> 
    <th>Total Revenue</th> 
    <th>Total SQ FT</th> 
    <th>AVG Revenue Per SQ FT</th> 
    <th>Total Number of Units</th> 
    <th>AVG Revenue Per Unit</th> 
    </tr> 
    </head>"; 


if ($result = $conn->query($sql)) { 

    // fetch associative array 
    while ($row = $result->fetch_assoc()) { 

    echo "<tbody>"; 
    echo "<tr>"; 
    echo "<td>" . $row['company'] . "</td>"; 
    echo "<td>" ."$". $row['totalprice'] . "</td>"; 
    echo "<td>" . $row['sgtotsqft'] ."&nbsp;&nbsp;". "ft<sup>2</sup>". "</td>"; 
    echo "<td>" ."$". $row['avgsqftrevenue'] . "</td>"; 
    echo "<td>" . $row['sgtotqty'] . "</td>"; 
    echo "<td>" ."$". $row['avgunitrevenue'] . "</td>"; 
    echo "</tr>"; 
    echo "</tbody>"; 
    } 

    echo "</table>"; 

echo "<BR>"; 

すべてのヘルプは高く評価されています。

ありがとう、

+1

最初のクエリを実行すると、エラーは何ですか? – krasipenkov

+1

良い悲しみ。 「$」は保管しないでください。 http://meta.stackoverflow.com/questions/333952/why-should-i-provide-an-mcve-for-what-seems-to-me-to-be-a-very-simple-sql-を参照してください。クエリ – Strawberry

+0

笑私の悪い...スペルミス。 SUM(x.sgtotalquantity)を呼び出すと、私はx.sgtotalqauntityという名前をつけました。エラーを修正すると、私のテーブルにはデータが表示されますが、それでもかなりの違いがあります。これは、SELECT文が派生テーブルからそれらの値を合計するためにすべての請求書行を見つけることができないかのようにまだです... – rdimouro

答えて

0

スペルミスと書式設定の問題がありました。埋め込みSELECTステートメント内で書式設定するのではなく、最終データを書式設定することで、テーブルデータが正確になりました。

成功CODE:

$sql = "SELECT x.company, x.stagestatus, x.shippeddate, FORMAT(SUM(x.totprice), 2) as totalprice, FORMAT(SUM(x.sgtotquantity), 2) as sgtotqty, FORMAT(SUM(x.sgtotalsqft), 2) as sgtotsqft, FORMAT(SUM(x.avgsqftrev), 2) as avgsqftrevenue, FORMAT(SUM(x.avgunitrev), 2) as avgunitrevenue FROM (SELECT t1.company, t1.stagestatus, t1.shippeddate, t1.id, TRIM(LEADING '$' FROM t1.totalprice) AS totprice, t2.invoiceid, SUM(t2.quantity) AS sgtotquantity, SUM(t2.width * t2.height * t2.quantity) /144 AS sgtotalsqft, (TRIM(LEADING '$' FROM t1.totalprice)/(SUM(t2.width * t2.height * t2.quantity) /144)) as avgsqftrev, (TRIM(LEADING '$' FROM t1.totalprice)/SUM(t2.quantity)) AS avgunitrev 
FROM invoices AS t1 INNER JOIN lineitems AS t2 ON t1.id = t2.invoiceid 
WHERE (t2.invoiceid = t1.id) 
GROUP BY t1.id) x 
WHERE x.stagestatus='Complete' 
GROUP BY x.company ASC"; 

ありがとうございました!!!

関連する問題