2010-07-23 73 views
0

我有一個比爾表這樣矩陣/交叉/樞軸查詢mySQL中

BillNo - 1,-1 ServiceCode,服務名稱 - '實驗室測試',ItemAmount -30

BillNo -1,ServiceCode - 2,服務名稱-'Consultation」,ItemAmount -70

我需要這樣的

比爾沒有-1,總帳單金額-100,實驗室測試-30,諮詢-70,藥物-0,Misc-輸出0

因此,基本上我需要的是BillNo分組的所有ItemAmount的總和。然後在同一行中,我需要將這個帳單金額分配給4個ServiceNames。所以100分配爲實驗室測試30和諮詢70。

這給了我我想要的,但它不是最優的。

SELECT 
    BD.BILLNO AS BN, 
    SUM(BD.ITEMAMOUNT) AS "Bill Amount", 
    (SELECT SUM(BD.ITEMAMOUNT) FROM BILLDETAILS BD 
     WHERE SERVICENAME LIKE '%Lab%' 
     AND BD.BILLNO = BN) AS "Lab", 
    (SELECT SUM(BD.ITEMAMOUNT) FROM BILLDETAILS BD 
     WHERE SERVICENAME LIKE '%Consult%' 
     AND BD.BILLNO = BN) AS "Consultation", 
    (SELECT SUM(BD.ITEMAMOUNT) FROM BILLDETAILS BD 
     WHERE SERVICENAME LIKE '%Procedure%' 
     AND BD.BILLNO = BN) AS "Procedures", 
    (SELECT SUM(BD.ITEMAMOUNT) FROM BILLDETAILS BD 
     WHERE SERVICENAME LIKE '%Drugs%' 
     AND BD.BILLNO = BN) AS "Drugs", 
    (SELECT SUM(BD.ITEMAMOUNT) FROM BILLDETAILS BD 
     WHERE SERVICENAME NOT LIKE '%Lab%' 
     AND SERVICENAME NOT LIKE 'Consult%' 
     AND SERVICENAME NOT LIKE '%Procedure%' 
     AND SERVICENAME NOT LIKE '%Drugs%' 
     AND BD.BILLNO = BN)AS "Miscellaneous" 
FROM BILLDETAILS BD 
GROUP BY BD.BILLNO 

我該如何改進這個mySQL查詢?

謝謝。 Chak。

回答

1

試試這個:

SELECT 
    BillNo, 
    LabTest, 
    Consultation, 
    Drugs, 
    Misc, 
    LabTest + Consultation + Drugs + Misc AS BillAmount 
FROM (
    SELECT 
    BillNo, 
    IFNULL(GROUP_CONCAT(IF(ServiceCode=1, ItemAmount, NULL)), 0) AS LabTest, 
    IFNULL(GROUP_CONCAT(IF(ServiceCode=2, ItemAmount, NULL)), 0) AS Consultation, 
    IFNULL(GROUP_CONCAT(IF(ServiceCode=3, ItemAmount, NULL)), 0) AS Drugs, 
    IFNULL(GROUP_CONCAT(IF(ServiceCode=4, ItemAmount, NULL)), 0) AS Misc 
    FROM bill 
    GROUP BY BillNo 
) AS services; 

我已經測試ServiceCode而非ServiceName,正如我認爲這兩個是相關的。如果它們不相關,則根據需要更改比較。

測試數據:

INSERT INTO bill (BillNo, ServiceCode, ServiceName, ItemAmount) VALUES 
(1, 1, 'Lab Test', 30), 
(1, 2, 'Consultation', 70), 
(2, 1, 'Lab Test', 40), 
(2, 2, 'Consultation', 20), 
(2, 3, 'Drugs', 15), 
(2, 4, 'Misc', 25); 

結果:

+--------+---------+--------------+-------+------+------------+ 
| BillNo | LabTest | Consultation | Drugs | Misc | BillAmount | 
+--------+---------+--------------+-------+------+------------+ 
|  1 | 30  | 70   | 0  | 0 |  100 | 
|  2 | 40  | 20   | 15 | 25 |  100 | 
+--------+---------+--------------+-------+------+------------+ 
0

你可以試試這個,雖然我havnt測試它 -

SELECT BillNo,count(ItemAmount) as "Total Bill Amount", 
(CASE ServiceName WHEN 'Lab test' THEN count(ServiceName) as "Lab Test" 
WHEN 'Consultation' THEN count(ServiceName) as Consultation 
WHEN 'Drugs' THEN count(ServiceName) as Drugs 
ELSE count(ServiceName) as Misc END CASE) 
from Bill group by BillNo; 
+0

我想我需要這樣的東西老齡化報告的查詢 - 如果它是30到60天之間談到60日列下等等。 – Chakra 2010-07-23 05:29:56

+0

'在30和60之間時,則「60天」爲列名 – Sadat 2010-07-23 08:21:37