2012-07-05 73 views
1

早上好,我有mysql查詢,我想計算查詢返回的記錄總數的百分比,MySQL或PHP計算總記錄的百分比?

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 1 100 | Adv 2 300 | Adv 3 600 | 總計1000.我能否在案例後面添加另一列來計算Cases/Total * 100,例如,Adv 1輸出寫入爲10%。從我的研究中,我不確定它是否更好地在php或mysql中執行此操作?

感謝您尋找。

回答

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>"; 
} 
?> 

有說,你應該使用php PDO object進行查詢。

至於幫助,很高興能夠回饋給這個社區只是我在這裏看到的一小部分事情,並得到有用的答案。

+0

非常感謝閃電快速回復非常感謝,這正是我所需要的,你知道如果實現這個結果也可能在PHP?我只問,因爲我前面的一些疑問已經有多個選擇&是相當複雜的[無論如何!]。再次感謝您的努力 – gary 2012-07-05 09:36:51

+1

您可以在PHP中通過將每個顧問程序的總數添加到腳本中的一個變量中(例如在填充數組的同時),然後在顯示屏中添加一個百分比列$陣列[advisorTotal]/$ overallTotal。 – Fluffeh 2012-07-05 09:40:03

+1

如果你發佈你的PHP代碼,我可以爲你修改它btw。 – Fluffeh 2012-07-05 09:55:30

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 tblcasesCaseID INT(11)NOT NULL AUTO_INCREMENT, ContactAssignedTo INT(11)NOT NULL, PRIMARY KEY(CaseID) )ENGINE = InnoDB的默認字符集= 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 tblcontactsContactID INT(11)NOT NULL AUTO_INCREMENT, ContactFullName VARCHAR(64)NOT NULL, PRIMARY KEY(ContactID) )ENGINE = InnoDB的默認字符集= LATIN1 AUTO_INCREMENT = 7;

INSERT INTO tblcontactsContactIDContactFullName)VALUES(1, '阿米特1'),(2, '阿米特2'),(3, '阿米特3'),(4, '阿米特4'),( 5,'amit 5'),(6,'amit 6');

結果會是這樣的,這對數據庫中上面的數據是正確的。

顧問例百分比

阿米特1 4 20。0000

阿米特2 2 10.0000

阿米特3 4 20.0000

阿米特4 2 10.0000

阿米特5 3 15.0000

阿米特6 1 5.0000

+0

如果tblcases的記錄沒有鏈接到外部查詢中返回的記錄,該怎麼辦? – Fluffeh 2012-07-05 10:56:54

+0

對於您提到的情況,此查詢也正常工作。 – 2012-07-05 11:08:33

+0

不,「(選擇COUNT(A.CaseID)FROM tblcases AS A)」將統計tblcases表中的所有記錄,而不僅僅是與顧問鏈接的記錄。在tblContacts中沒有顧問的tblcases中的記錄仍將被退回。 – Fluffeh 2012-07-05 11:11:08