sql用到的少 学的也很浅 现在我遇到这个问题,数据库中有好几个表,结构不尽相同,字段名字也是。
如:
表A中 a1是日期时间
表B中 b2是日期时间
.
.
.
我现在得根据用户的选择进行查询某一个时间段的XX记录
我想到了用case语句
于是在sql 2005中先用变量模拟用户的选择这么写了:DECLARE @MyVar INT
SET @MyVar = 1SELECT TOP 30 *(CASE @MyVar
WHEN 1 THEN convert(VARCHAR(10),a1,120)
WHEN 2 THEN convert(VARCHAR(10),b2,120)
END)AS dToday,Count(*) AS Nums
FROM(CASE @MyVar
WHEN 1 THEN A
WHEN 2 THEN B
END)
WHERE(CASE @MyVar
WHEN 1 THEN convert(VARCHAR(10),a1,120)
WHEN 2 THEN convert(VARCHAR(10),b2,120)
END) BETWEEN '2002-01-01' AND '2009-05-01'
GROUP BY(CASE @MyVar
WHEN 1 THEN convert(VARCHAR(10),a1,120)
WHEN 2 THEN convert(VARCHAR(10),b2,120)
END)我想看到上面的语句 我的意图 大家能理解吧
可惜怎么改也都不对 请大家帮忙给个解决方法
语句也不限于CASE 但是因为这样的表其实很多 所以最好不要用IF来挨个判断。
分数酌情给加
如:
表A中 a1是日期时间
表B中 b2是日期时间
.
.
.
我现在得根据用户的选择进行查询某一个时间段的XX记录
我想到了用case语句
于是在sql 2005中先用变量模拟用户的选择这么写了:DECLARE @MyVar INT
SET @MyVar = 1SELECT TOP 30 *(CASE @MyVar
WHEN 1 THEN convert(VARCHAR(10),a1,120)
WHEN 2 THEN convert(VARCHAR(10),b2,120)
END)AS dToday,Count(*) AS Nums
FROM(CASE @MyVar
WHEN 1 THEN A
WHEN 2 THEN B
END)
WHERE(CASE @MyVar
WHEN 1 THEN convert(VARCHAR(10),a1,120)
WHEN 2 THEN convert(VARCHAR(10),b2,120)
END) BETWEEN '2002-01-01' AND '2009-05-01'
GROUP BY(CASE @MyVar
WHEN 1 THEN convert(VARCHAR(10),a1,120)
WHEN 2 THEN convert(VARCHAR(10),b2,120)
END)我想看到上面的语句 我的意图 大家能理解吧
可惜怎么改也都不对 请大家帮忙给个解决方法
语句也不限于CASE 但是因为这样的表其实很多 所以最好不要用IF来挨个判断。
分数酌情给加
表真不少。
--这样吧,动态执行
DECLARE @MyVar INT
SET @MyVar = 1 print
'SELECT '+CASE @MyVar
WHEN 1 THEN 'convert(VARCHAR(10),a1,120)'
WHEN 2 THEN 'convert(VARCHAR(10),b2,120)'
END+' AS dToday,Count(*) AS Nums
FROM '+CASE @MyVar
WHEN 1 THEN 'A'
WHEN 2 THEN 'B'
END+'
WHERE '+CASE @MyVar
WHEN 1 THEN 'convert(VARCHAR(10),a1,120)'
WHEN 2 THEN 'convert(VARCHAR(10),b2,120)'
END+' BETWEEN ''2002-01-01'' AND ''2009-05-01''
GROUP BY '+CASE @MyVar
WHEN 1 THEN 'convert(VARCHAR(10),a1,120)'
WHEN 2 THEN 'convert(VARCHAR(10),b2,120)'
END
-----------------------------
SELECT convert(VARCHAR(10),a1,120) AS dToday,Count(*) AS Nums
FROM A
WHERE convert(VARCHAR(10),a1,120) BETWEEN '2002-01-01' AND '2009-05-01'
GROUP BY convert(VARCHAR(10),a1,120)
SET @MyVar = 1 declare @sql varchar(8000)
select @sql = 'SELECT '+CASE @MyVar
WHEN 1 THEN 'convert(VARCHAR(10),a1,120)'
WHEN 2 THEN 'convert(VARCHAR(10),b2,120)'
END+' AS dToday,Count(*) AS Nums
FROM '+CASE @MyVar
WHEN 1 THEN 'A'
WHEN 2 THEN 'B'
END+'
WHERE '+CASE @MyVar
WHEN 1 THEN 'convert(VARCHAR(10),a1,120)'
WHEN 2 THEN 'convert(VARCHAR(10),b2,120)'
END+' BETWEEN ''2002-01-01'' AND ''2009-05-01''
GROUP BY '+CASE @MyVar
WHEN 1 THEN 'convert(VARCHAR(10),a1,120)'
WHEN 2 THEN 'convert(VARCHAR(10),b2,120)'
END exec(@sql)
SET @MyVar = 1 select a.* from a where @MyVar = 1
union all
select b.* from a where @MyVar = 2
...不过你union all时,需要把查询的结果中所有的字段的类型和顺序设置成一样的.
谢谢 nianran520 和 dawugui的帮忙啦