2012-02-02 171 views
2
 SELECT 
    COUNT(id), AgeRange 
    FROM 
    (
    select 
     id, 
     case 
     when age < 0 then 'less than 0' 
     when age >= 0 and age <=30 then '0-30' 
     when age >= 31 and age <=60 then '31-60' 
     when age >= 61 and age <=90 then '61-90' 
     when age >= 91 then '91+' 
     when age = null then 'NO INFORMATION' 
     else 'no catagory' 
    end AS AgeRange 
from queue 
where DATE between '01-Apr-2011' and '05-May-2011' 
) T 
GROUP BY 
    AgeRange; 

我希望这些ageRanges(0-30,31-60,61-90)是动态的。这意味着这些值应该来自一个表格(因为这些是由用户设置的)。用户可以根据需要设置多个值来获取结果。我怎么能做到这一点..其迫切的,有人可以plz帮助...动态情况下

+1

请勿使用'CASE'。加入表格。 – 2012-02-03 02:20:50

回答

4

假设你有一个第二个表,如:

ASSIST_TABLE 
FromAge|ToAge|Text 
0|30|'0-30' 

的,你可以做这样的事情。

SELECT 
COUNT(id), 
FROM 
(
select 
    id, 
    ISNULL(select text from ASSIST_TABLE 
    where Age between FromAge andToAge),'NO CATEGORY') AS AGERANGE 
from queue 
where DATE between '01-Apr-2011' and '05-May-2011' 
) T 
GROUP BY 
AgeRange; 

如果你想坚持你的case-statement,你将不得不声明动态。这意味着首先生成查询,将其存储到变量中并最终执行。这是更多的工作!

+0

thanx的回应...但是我想坚持案件陈述,因为我想要一个结果像foll .. – Pramod 2012-02-02 13:05:31

+0

thanx的回应...但是我想坚持案件陈述,因为我想要一个结果像foll .. 计数范围 --------------- 10 31-60 115 61-90 – Pramod 2012-02-02 13:07:10

+0

好的Pramod。为此,您需要定义一个游标来循环遍历第二个表。 1.将第一部分写入var,2.循环遍历第二个表并写入case-clause 3.将语句的结尾写入var。比超越它。 – chris 2012-02-02 13:10:27

1

这是另一个尝试:动态SQL,它不是最终的答案,但你会明白这一点。

CREATE PROCEDURE sp_generate_valid_choices (IN p_request_id Bigint) 
BEGIN 
DECLARE num_rows INT DEFAULT 0; 
DECLARE no_more_rows BINARY; 
DECLARE no_more_subrows BINARY; 
DECLARE loop_cntr INT DEFAULT 0; 
DECLARE var_choice_group BIGINT DEFAULT 0; 

-- Declare Cursor for the loop through the constraint_groups 
DECLARE cur_constraint_group CURSOR FOR 
SELECT distinct choice_constraint_group FROM aip_choice_constraint 
    WHERE choice_id_rule_parameter IN (SELECT choice_id FROM aip_request_detail 
             where request_id = p_request_id); 
-- DECLARE 'handlers' for exceptions 
DECLARE CONTINUE HANDLER FOR NOT FOUND 
SET no_more_rows := TRUE; 

-- OPEN CURSOR AN PROCESS CONSTRAINT_GROUPS 
OPEN cur_constraint_group; 
SELECT FOUND_ROWS() INTO num_rows; 

choice_group_loop: LOOP 
    FETCH cur_constraint_group 
    INTO var_choice_group; 

IF no_more_rows THEN 
    CLOSE cur_constraint_group; 
    LEAVE choice_group_loop; 
END IF; 
-- PAYLOAD 
-- INSERT THE VALID CHOCIES INTO tmp_aip_valid_choices 
SELECT @var_sql_query := CONCAT('INSERT INTO tmp_aip_valid_choices ','SELECT ',p_request_id,' as request_id, `aip_choice_constraint`.`choice_constraint_id`,`aip_choice_constraint`.`choice_constraint_group` 
    ,AVG(IF (`aip_request_detail`.`choice_varchar_value`', `aip_choice_constraint`.`choice_constraint_operator`, '\'',`aip_choice_constraint`.`choice_constraint_value`, '\'',',1,0)) AS VALID 
FROM `aip_choice_constraint` 
LEFT JOIN `aip_request_detail` ON `aip_request_detail`.`choice_id` = `aip_choice_constraint`.`choice_id_rule_parameter` 
WHERE `aip_choice_constraint`.choice_constraint_group =' , var_choice_group, 
' GROUP BY `aip_choice_constraint`.choice_constraint_group') 
FROM `aip_choice_constraint` WHERE `aip_choice_constraint`.choice_constraint_group = var_choice_group; 
PREPARE SQL_STATEMENT FROM @var_sql_query; 
EXECUTE SQL_STATEMENT; 
-- INCREMENT THE COUNTER 
SET loop_cntr = loop_cntr + 1; 

END LOOP choice_group_loop; 

INSERT INTO tmp_aip_valid_choices_for_request 
(request_id, choice_id) 
SELECT DISTINCT p_request_id, choice_id FROM aip_choice ac 
-- RULE 1 ALL CHOICES WITHOUT CONSTRAINTS 
WHERE ac.choice_id NOT IN (SELECT choice_id_rule_target FROM aip_choice_constraint) 
-- RULE 2 ALL CHOICES WITH CONSTRAINTS, THAT ARE NOT YET ANSWERED 
OR ac.choice_id NOT IN (SELECT choice_id_rule_target FROM aip_choice_constraint 
WHERE choice_id_rule_parameter IN (SELECT choice_id FROM aip_request_detail WHERE request_id = p_request_id)) 
-- RULE 3 ALL CHOICES WITH CONSTRAINTS, THAT ARE TRUE 
OR ac.choice_id IN (SELECT choice_id_rule_target FROM aip_choice_constraint 
WHERE choice_constraint_group IN (SELECT choice_constraint_group FROM tmp_aip_valid_choices WHERE request_id = p_request_id AND VALID = 1)); 

END // 
Delimiter ; 

该代码是MySQL的,所以你不能复制它。但这个想法是一样的。准备好您的语句作为字符串,然后执行它。