1

おはようございます。mysqlクエリがあり、クエリによって返された合計レコードの割合を計算したいと思います。

Select
  tblcontacts.ContactFullName As Advisor,
  Count(tblcases.CaseID) As Cases
From
  tblcases Inner Join
  tblcontacts On tblcontacts.ContactID =
    tblcases.ContactAssignedTo
Group By
  tblcontacts.ContactFullName with rollup

これにより、データAdv 1100|が出力されます。Adv 2 300 | Adv 3 600 | 合計1000。ケースの後に別の列を追加して、ケース/合計* 100を計算できますか?たとえば、Adv 1の出力は10%として書き込まれます。私の調査から、これをphpまたはmysqlで行う方がよいかどうかわかりませんか?

見てくれてありがとう。

4

2 に答える 2

2

このコードはトリックを行う必要があります:

select
    a.advisor,
    a.cases,
    round((a.cases/b.totalCases)*100,2) as PercentCases
from
(
    Select
      tblcontacts.ContactFullName As Advisor,
      Count(tblcases.CaseID) As Cases
    From
      tblcases Inner Join
      tblcontacts On tblcontacts.ContactID =
        tblcases.ContactAssignedTo
    Group By
      tblcontacts.ContactFullName with rollup
) a,
(
    Select
      Count(tblcases.CaseID) As Cases
    From
      tblcases Inner Join
      tblcontacts On tblcontacts.ContactID =
        tblcases.ContactAssignedTo
) b

tblCasesテーブルに、最初のクエリで返されるもの以外のレコードがない場合は、次のようにbステートメントを実行できます。

(
    Select
      Count(tblcases.CaseID) As Cases
    From
      tblcases 
) b

提供したコードに基づくPHPバージョンは次のようになります。

<?php
mysql_select_db($database_ghl_portal, $ghl_portal); 
$query_Recordset1 = "
    SELECT 
        tblcontacts.ContactFullName, 
        Count(tblcases.CaseID) As Cases 
    FROM 
        tblcases 
            Inner Join 
            tblcontacts 
            On tblcontacts.ContactID = tblcases.ContactAssignedTo 
    GROUP BY 
        tblcontacts.ContactFullName with rollup";
$totalValue=0;
$i=0;
$Recordset1 = mysql_query($query_Recordset1, $ghl_portal) or die(mysql_error()); 
$row_Recordset1 = mysql_fetch_assoc($Recordset1); 
while ($row_Recordset1 = mysql_fetch_assoc($Recordset1))
{
    $totalValue+=$row_Recordset1["Cases"];
    // Do all your other stuff to put the result into an array here such as
    $yourArray[$i][0]=$row_Recordset1["Advisor"];
    $yourArray[$i][1]=$row_Recordset1["Cases"];
    $i++;
}
$totalRows_Recordset1 = mysql_num_rows($Recordset1); 


// And your output code would look like:
for ($j=0; $j<$totalRows_Recordset1; $j++)
{
    echo "Advisor: ".$yourArray[$j][0]."<br>";
    echo "Count: ".$yourArray[$j][1]."<br>";
    echo "Percentage: ".(round(($yourArray[$j][1]/$totalValue),2)*100)."<br><br>";
}
?>

そうは言っても、クエリにはphpPDOオブジェクトを使用する必要があります。

支援に関しては、私がここで調べて有用な回答を得たもののほんの一部をこのコミュニティに還元できるのは素晴らしいことです。

于 2012-07-05T09:15:15.603 に答える
0

このクエリを試してください

SELECT tblcontacts.ContactFullName AS Advisor, 
COUNT( tblcases.CaseID ) AS Cases,
(COUNT( tblcases.CaseID )*100)/(SELECT COUNT( A.CaseID ) FROM tblcases AS A) as Percentage
FROM tblcases
INNER JOIN tblcontacts ON tblcontacts.ContactID = tblcases.ContactAssignedTo
GROUP BY tblcontacts.ContactFullName

データベースのアーキテクチャとデータについて考えてみましょう。

CREATE TABLE IF NOT EXISTS tblcasesCaseIDint(11)NOT NULL AUTO_INCREMENT、 ContactAssignedToint(11)NOT NULL、PRIMARY KEY(CaseID))ENGINE = InnoDB DEFAULT CHARSET = latin1 AUTO_INCREMENT = 21;

INSERT INTO tblcasesCaseIDContactAssignedTo)VALUES(1、1)、(2、1)、(3、1)、(4、1)、(5、2)、(6、2)、(7、3)、(8 、3)、(9、3)、(10、3)、(11、4)、(12、4)、(13、5)、(14、5)、(15、5)、(16、6 )、(17、7)、(18、7)、(19、8)、(20、8);

CREATE TABLE IF NOT EXISTS tblcontactsContactIDint(11)NOT NULL AUTO_INCREMENT、 ContactFullNamevarchar(64)NOT NULL、PRIMARY KEY(ContactID))ENGINE = InnoDB DEFAULT CHARSET = latin1 AUTO_INCREMENT = 7;

INSERT INTO tblcontactsContactIDContactFullName)VALUES(1、'amit 1')、(2、'amit 2')、(3、'amit 3')、(4、'amit 4')、(5、'amit 5') 、(6、'amit 6');

結果は次のようになります。これは、データベース内の上記のデータに対して正しいものです。

アドバイザーのケースの割合

amit 1 4 20.0000

amit 2 2 10.0000

amit 3 4 20.0000

amit 4 2 10.0000

amit 5 3 15.0000

amit 6 1 5.0000

于 2012-07-05T10:49:00.767 に答える