輸出

2011-05-17 10 views
2

我有以下表輸出

customers 

cust_id  cust_name 
1   a company 
2   a company 2 
3   a company 3 

tariffs 

tariff_id cost_1  cost_2  cost_3 
1   2   0   3 
2   1   1   1 
3   4   0   0 


terminals 

term_id  cust_id  term_number  tariff_id 
1   1   12345   1 
2   1   67890   2 
3   2   14324   1 
4   3   78788   3 

usage 

term_ident usage_type usage_amount date 
12345  1   20    11/12/2010 
67890  2   10    31/12/2010 
14324  1   1    01/01/2011 
14324  2   5    01/01/2011 
78788  1   0    14/01/2011 

在現實生活中的表是相當大的 - 有5000個客戶,250個資費500000個碼頭和500萬的使用記錄。

在終端表中 - term_id,cust_id和tariff_id都是外鍵。用法表中沒有外鍵 - 這只是從csv文件導入的原始數據。

使用表中可能存在不存在於終端表中的終端 - 這些可以忽略。

我需要做的是根據使用情況爲每個客戶生成一張發票。我只想在2010年12月15日至2011年1月15日之間包含使用情況 - 這是結算週期。我需要根據其費率計算使用費用的發票行項...例如:在使用表中記錄第一筆記錄 - usage_1(對於term_id 1)的費用爲90x2 = 180,這是因爲term_ident使用tariff_id數1

輸出應該如下

Customer 2 

date   terminal usage_cost_1 usage_cost_2 usage_cost_3 total cost 
01/01/2011 14324  18   0    6    24 

我是一個稱職的PHP開發者 - 但僅SQL初學者。我需要一些建議是生成發票的最有效的過程 - 也許有一個SQL查詢可以在PHP中的處理開始計算成本之前幫助我 - 或者SQL語句也可能產生成本?任何意見是值得歡迎....

編輯:

1)目前運行這個進程的東西 - 它用C++編寫,並需要大約24小時內處理這個......我沒有訪問資源。

2)我在Symfony中使用Doctrine - 我不知道如何有用的Doctrine將作爲檢索數據,因爲對象只會減慢進程 - 而且我不確定對象的使用是否會幫助太多這裏 ?

編輯@ 13:54 - >

當初錯誤地指定使用表...對不起!

我必須將usage_type映射到每個終端的具體資費成本,即usage_type 1 = cost_1以適當的資費...我想這使得它稍微複雜一些?

+0

我怎麼知道term_ident = 12345使用的是tariff_id = 1?它是否使用1到5的所有關稅代碼? – Alp 2011-05-17 10:24:45

+1

這不應該採取任何接近24小時.. – Nick 2011-05-17 10:25:42

+0

@Alp ..抱歉..不是很清楚我的問題 - term_ident = term_number在終端表 - 我給它們命名不同,因爲它們之間沒有任何關係(在MySQL中) 。 – ManseUK 2011-05-17 10:26:30

回答

3

你去那裏,應該不超過24小時;)

SELECT u.date, u.term_ident terminal, 
    (ta.cost_1 * u.usage_1) usage_cost_1, 
    (ta.cost_2 * u.usage_2) usage_cost_2, 
    (ta.cost_3 * u.usage_3) usage_cost_3, 
    (usage_cost_1 + usage_cost_2 + usage_cost_3) total_cost 
FROM usage u 
INNER JOIN terminals te ON te.term_number = u.term_ident 
INNER JOIN tariffs ta ON ta.tariff_id = te.tariff_id 
INNER JOIN customers c ON c.cust_id = te.cust_id 
WHERE u.date BETWEEN '2010-12-15' AND '2011-01-15' 
    AND c.cust_id = 2 

本查詢只用於CUST_ID = 2。客戶如果您想爲整個數據集的結果,只是刪除的條件。

更新

這對新的要求並不是那麼無足輕重。您可以將使用錶轉換爲之前發佈的新表。

要做出SELECT查詢的決定,你可以這樣做。但這不是你期望的結果。它可以用來創建轉換後的新用法表。

SELECT u.date, u.term_ident terminal, 
    CASE u.usage_type 
     WHEN 1 then ta.cost_1 * u.usage_1 
     WHEN 2 then ta.cost_2 * u.usage_2 
     WHEN 3 THEN ta.cost_3 * u.usage_3 
    AS usage_cost 
FROM usage u 
INNER JOIN terminals te ON te.term_number = u.term_ident 
INNER JOIN tariffs ta ON ta.tariff_id = te.tariff_id 
INNER JOIN customers c ON c.cust_id = te.cust_id 
WHERE u.date BETWEEN '2010-12-15' AND '2011-01-15' 
    AND c.cust_id = 2 
+0

謝謝....也許我的問題措辭不夠好或解釋不夠...我必須爲每個客戶生成一張發票...我想我只會爲每個客戶發出上面的查詢(顯然會更改WHERE子句)...和日期將是一個額外的where子句......在哪裏日期<# and ># – ManseUK 2011-05-17 10:38:31

+0

對不起,我忘了日期。如果您告訴我日期的列類型,我會更新我的答案。 – Alp 2011-05-17 10:43:41

+0

其DATETIME ...再次..謝謝你... – ManseUK 2011-05-17 10:54:30