-2

我有这个查询,我在其中计算了一些列我的问题是将所有这些计数结果计算在一个新字段中

SELECT 
CONCAT(u.firstname,' ',u.lastname) AS 'agent',
COUNT(CASE WHEN pa.answer_text LIKE '%yes%' THEN pa.answer_id END) AS yes,
COUNT(CASE WHEN pa.answer_text LIKE '%no%' THEN pa.answer_id END) AS NO,
COUNT(CASE WHEN l2u.lead_status_id IN (4,5,8,39) THEN l2u.lead_id END) AS pending,
COUNT(CASE WHEN l2u.lead_status_id IN (7,14,43) THEN l2u.lead_id END) AS wrong_number,

这是问题..正确的语法是什么

COUNT(pending + wrong_number + yes + NO) AS 'total'
FROM USER u, poll_votes pv, poll_answers pa, lead_to_user_original l2u

WHERE u.user_id = pv.user_id
AND pv.answer_id = pa.answer_id
AND l2u.lead_id = pv.vote_lead_id
AND (pa.answer_client_one = '869' OR pa.answer_client_two = '869')
AND pv.vote_date BETWEEN '2013-07-01 00:00:01' AND '2013-07-17 23:59:59'
GROUP BY u.user_id
4

2 回答 2

2

You can't access aliases in your SELECT clause in another field in the select. You can "push" it down to a sub-query, and do something like this:

SELECT a.*, pending + wrong_number + yes + no AS 'total'
FROM (
    SELECT 
        CONCAT(u.firstname,' ',u.lastname) AS 'agent',
        COUNT(CASE WHEN pa.answer_text LIKE '%yes%' THEN pa.answer_id END) AS yes,
        COUNT(CASE WHEN pa.answer_text LIKE '%no%' THEN pa.answer_id END) AS NO,
        COUNT(CASE WHEN l2u.lead_status_id IN (4,5,8,39) THEN l2u.lead_id END) AS pending,
        COUNT(CASE WHEN l2u.lead_status_id IN (7,14,43) THEN l2u.lead_id END) AS wrong_number,
    FROM USER u
    JOIN poll_votes pv
      ON u.user_id = pv.user_id
    JOIN poll_answers pa
      ON pv.answer_id = pa.answer_id
    JOIN lead_to_user_original l2u
      ON l2u.lead_id = pv.vote_lead_id
    WHERE (pa.answer_client_one = '869' OR pa.answer_client_two = '869')
      AND pv.vote_date BETWEEN '2013-07-01 00:00:01' AND '2013-07-17 23:59:59'
    GROUP BY u.user_id
) AS a

I also changed your query to use "ANSI-92 style" joins, I think it's much more readable...

于 2013-07-17T12:55:59.323 回答
2

如何将它包装在子查询中?

SELECT  agent,  yes, no, pending, wrong_number,
        yes + no + pending + wrong_number AS Total
FROM
        (
            SELECT  CONCAT(u.firstname,' ',u.lastname) AS 'agent',
                    COUNT(CASE WHEN pa.answer_text LIKE '%yes%' THEN pa.answer_id END) AS yes,
                    COUNT(CASE WHEN pa.answer_text LIKE '%no%' THEN pa.answer_id END) AS NO,
                    COUNT(CASE WHEN l2u.lead_status_id IN (4,5,8,39) THEN l2u.lead_id END) AS pending,
                    COUNT(CASE WHEN l2u.lead_status_id IN (7,14,43) THEN l2u.lead_id END) AS wrong_number
            FROM    USER u
                    INNER JOIN poll_votes pv 
                        ON u.user_id = pv.user_id 
                    INNER JOIN poll_answers pa 
                        ON pv.answer_id = pa.answer_id
                    INNER JOIN lead_to_user_original l2u 
                        ON l2u.lead_id = pv.vote_lead_id

            WHERE   (pa.answer_client_one = '869' OR pa.answer_client_two = '869')
                    AND pv.vote_date BETWEEN '2013-07-01 00:00:01' AND '2013-07-17 23:59:59'
            GROUP   BY u.user_id
        ) subA
于 2013-07-17T12:52:15.733 回答