本帖最后由 wjzwang 于 2012-4-21 11:30 编辑
如图,现需根据"汇总"表中的餐段筛选"数据源"表里的数据,得出结果,最先想到的是通过UNION ALL连接早餐至特晚共6个字段的数据,重组一个新的数据源,如下:
SELECT 部门,工号,姓名 FROM
(SELECT '早餐' AS 筛选,部门,工号,姓名,早餐 AS 值 FROM [数据源$]
UNION ALL
SELECT '中餐',部门,工号,姓名,中餐 FROM [数据源$]
UNION ALL
SELECT '晚餐',部门,工号,姓名,晚餐 FROM [数据源$]
UNION ALL
SELECT '夜宵',部门,工号,姓名,夜宵 FROM [数据源$]
UNION ALL
SELECT '特中',部门,工号,姓名,特中 FROM [数据源$]
UNION ALL
SELECT '特晚',部门,工号,姓名,特晚 FROM [数据源$]),[汇总$A2:A3]
WHERE 值>0 AND 筛选=餐段
ORDER BY 部门,工号
但每多一个餐段,就得多一个UNION,感觉不够灵活,于是想能不能在WHERE 时就作出判断,得出筛选的餐段,从而得到正确的WHERE字段?
经过wuxiang_123(吴干事)的指点,学到了SWITCH函数,从而简化了SELECT语句,如下:
SELECT 部门,工号,姓名 FROM [数据源$],[汇总$A2:A3] WHERE SWITCH(餐段='早餐',早餐,餐段='中餐',中餐,餐段='晚餐',晚餐,餐段='夜宵',夜宵,餐段='特中',特中,餐段='特晚',特晚) is not null
特此留个记号,以便日后忘记!
- 吴版说,因为数据源里,各餐段的数据并没有出现0,所以上面的SWITCH语句中"is not null"可以省去不用.
-
- 除了SWITCH外,CHOOSE+INSTR也可以实现这一题的要求,如下:
- SELECT 部门,工号,姓名 FROM [数据源$],[汇总$A2:A3] WHERE CHOOSE(INSTR("早餐中餐晚餐夜宵特中特晚",餐段)/2+1,早餐,中餐,晚餐,夜宵,特中,特晚)
-
- 只是有个限制,只适用于餐段不名称是两个字,且组合起来没有重复的情况
复制代码
|