2013-11-15 107 views
0

我想寫一個SQL查詢來計算許可證的價格。 請檢查下面的模式:SQL查詢建議請

表:價格

| ID (bigint) | USERS(Bigint) | TYPE (varchar) | PRICE (BIGINT) 
------------------------------------------------------------------ 
| 1   |  1  |  other  |  20  | 
| 2   |  15  |  local  |  13.96 | 

表:許可證

| ID (bigint) | USERID (Bigint) |STATUS(VARCHAR) | USERS(bigint) | DEVICES(BIGINT) | TYPE(VARCHAR) | REQUEST_TYPE (VARCHAR) | 
-------------------------------------------------------------------------------------------------------------- 
| 1   | 13   |  10  |  10  |  local  |   add   | 
| 2   | 13   |  15  |  20  |  other  |   extend  | 

我的目標:

給定一個用戶ID和類型,我想根據以下內容計算所有許可證的總價格荷蘭國際集團critirea:

對於給定的用戶標識和類型:

1)獲取已request_type如任一新的(或)延長

2)對於每個這樣的許可的所有許可,匹配的用戶的數量(USERS列)與'價格'表中的USERS列進行比較,並以設備計算*(價格表中的關聯價格)

3)使用此計算所有此類價格的總和並返回總價格。

我嘗試使用下面的查詢要做到這一點,但我沒有成功尚未:

SELECT SUM(PRICE) FROM prices 
LEFT OUTER JOIN licenses 
ON ( 
    prices.users=licenses.users 
    AND prices.type=licenses.type 
) 
WHERE licenses.userid=13 
AND licenses.status='approved' 
AND licenses.request_type IN ('add','extend') 

請點擊這裏SQL小提琴:http://sqlfiddle.com/#!2/05f5cf

普萊斯幫助。

謝謝, 大衛

回答

0

從您的意見和更新,我想你想(不知道是否有必要比較許可用戶和用戶在價格,但似乎你幾乎想這一點)

select coalesce(sum(p.users * p.price), 0) 
FROM licenses l 
inner join prices p 
    on p.type = l.type 
    --and p.users = l.users 
where l.status = 'approved' 
and l.request_type in ('add', 'extend') 
and l.userid = 13 

編輯

事實上,你需要檢查類型和用戶是相同的,或者只是用戶?

如果你只需要檢查的用戶,然後

inner join prices p 
    on p.users = l.users 

如果你只需要在類型檢查

inner join prices p 
    on p.type = l.type 

如果同時需要,你會得到0與樣品DATAS。

請參閱SqlFiddle有3個版本。

+0

謝謝。但是這個查詢中有一個價格是我想要的價格*許可證中沒有設備,但是這隻返回價格 – user2818666

+0

@ user2818666以及您的表中有哪些設備? –

+0

@ user2818666查看編輯也許 –

0

結果將是無效的,因爲查詢無法找到LEFT OUTER條件JOIN

有查詢

SELECT SUM(PRICE) FROM prices 
LEFT OUTER JOIN licenses 
ON ( 
    prices.users=licenses.users 
    AND prices.type=licenses.type //cannot found condition on table 
) 
WHERE licenses.userid=13 
AND licenses.status='approved' 
AND licenses.request_type IN ('add','extend') 
在這個

是表格內的數據

表許可證

(1, 'approved', 10, 10, 'local', 'add', 13), 
(2, 'approved', 15, 20, 'other', 'extend', 13); 

and table prices

(1, 1, 'other', 20), 
(2, 15, 'local', 13.96); 

,你的條件是

prices.users=licenses.users 
    AND prices.type=licenses.type //cannot found condition on table 
that mean if from your table is 

    at licences table have a type="other" and users=15 
    but at prices table haven't have type="other" and users=15 

這樣的結果將是空

,因爲當我改變表價格的第一行 (1,1, '其他',20) 變成(1,15, '其他',20),

,這將是有一個結果= 20

你需要改變你的查詢

SELECT SUM(PRICE) FROM prices 

be 

SELECT IFNULL(SUM(PRICE),0) FROM prices 

的第一線,這將改變的結果,如果沒有找到該行0 NOT NULL