2013-12-09 80 views
2

我有一個頭計數(voucher_credits.voucher_id),我已經使用WHERE語句將其添加到我的報告中,但我想再次添加它作爲另一列使用不同的標準,我該怎麼做?SQL使用相同的字段兩次以不同的標準

SELECT vouchers.code, vouchers.credit, count(voucher_credits.voucher_id) as Activated 
FROM vouchers, voucher_credits, users 
WHERE vouchers.id = voucher_credits.voucher_id 
    AND voucher_credits.remaining_credit = 0 
    AND users.id = voucher_credits.user_id AND users.state = 'active' 
    AND vouchers.is_customer_service = FALSE 
GROUP by vouchers.code, vouchers.credit 
ORDER by count(voucher_credits.voucher_id) DESC 
LIMIT 100 

第二列是users.state = '取消',不.remaining_credit = 0

回答

1

嘗試UNION ALL:

SELECT vouchers.code, vouchers.credit, count(voucher_credits.voucher_id) as Activated 
FROM vouchers, voucher_credits, users 
WHERE vouchers.id = voucher_credits.voucher_id 
    AND voucher_credits.remaining_credit = 0 
    AND users.id = voucher_credits.user_id AND users.state = 'active' 
    AND vouchers.is_customer_service = FALSE 
GROUP by vouchers.code, vouchers.credit 
ORDER by count(voucher_credits.voucher_id) DESC 
UNION ALL 
SELECT vouchers.code, vouchers.credit, count(voucher_credits.voucher_id) as Activated 
FROM vouchers, voucher_credits, users 
WHERE vouchers.id = voucher_credits.voucher_id 
    AND users.state = 'cancelled' 
    AND users.id = voucher_credits.user_id AND users.state = 'active' 
    AND vouchers.is_customer_service = FALSE 
GROUP by vouchers.code, vouchers.credit 
ORDER by count(voucher_credits.voucher_id) DESC 
1

如果所有的數據都來自同一行,你可以使用「條件和」計數,這基本上是基於表達式添加0或1的位置:

SELECT ..., 
    SUM(CASE WHEN voucher_credits.remaining_credit = 0 AND users.state = 'active' 
     THEN 1 ELSE 0 END) Activated, 
    SUM(CASE WHEN users.state = 'cancelled' THEN 1 ELSE 0 END) CanceledUser, 
FROM ... 
... 

使用您的查詢,這將是:

SELECT vouchers.code, vouchers.credit, 
    SUM(CASE WHEN voucher_credits.remaining_credit = 0 AND users.state = 'active' 
     THEN 1 ELSE 0 END) Activated, 
    SUM(CASE WHEN users.state = 'cancelled' THEN 1 ELSE 0 END) CanceledUser, 
FROM vouchers 
INNER JOIN voucher_credits ON vouchers.id = voucher_credits.voucher_id 
INNER JOIN users ON users.id = voucher_credits.user_id 
WHERE vouchers.is_customer_service = FALSE 
GROUP by vouchers.code, vouchers.credit 
ORDER by Activated DESC 
LIMIT 100 
1

您可以加入表格兩次。如果您從2個子查詢中獲得不同的記錄,我使用了FULL OUTER JOIN。隨意更改聯接類型。

select t1.code, t1.credit, t1.Activated, t2.code, t2.credit, t2.Cancelled 
from 
(SELECT vouchers.code, vouchers.credit, count(voucher_credits.voucher_id) as Activated 
FROM vouchers, voucher_credits, users 
WHERE vouchers.id = voucher_credits.voucher_id 
    AND voucher_credits.remaining_credit = 0 
    AND users.id = voucher_credits.user_id AND users.state = 'active' 
    AND vouchers.is_customer_service = FALSE 
GROUP by vouchers.code, vouchers.credit) t1 
FULL OUTER JOIN 
(SELECT vouchers.code, vouchers.credit, count(voucher_credits.voucher_id) as Cancelled 
FROM vouchers, voucher_credits, users 
WHERE vouchers.id = voucher_credits.voucher_id 
    AND users.state = 'cancelled' 
    AND users.id = voucher_credits.user_id AND users.state = 'active' 
    AND vouchers.is_customer_service = FALSE 
GROUP by vouchers.code, vouchers.credit) t2 
ON t1.code = t2.code and t1.credit = t2.credit 
相關問題