一个数据库查询的问题,请大家帮帮忙!

@Rainbow.Sole 2012-06-13 05:57:06
单位表:id,name
加油表:单位id,单位name,车辆号码,加油数量,加油时间

查询结果如下:

单位一 当日加油数量 累计加油数量 单位二 当日加油数量 累计加油数量
001 100 1080 101 200 2000
002 200 3000 102 540 8124

请大家帮忙看看这个查询应该怎么写,用一条语句是不是写不出来啊,如果用视图的话应该怎么写,谢谢!
查询的时候根据时间查询。


...全文
142 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
@Rainbow.Sole 2012-06-14
  • 打赏
  • 举报
回复
谢谢liangCK大哥了,我先琢磨一下,有问题我再请教!
@Rainbow.Sole 2012-06-14
  • 打赏
  • 举报
回复
用这样的查询代码可以得到结果,但是如果有另一张表 carcode 里面是所有的车队车辆信息,怎么在这个结果中显示当天与累计都没有加油的车辆呢,就是说怎么在结果中显示carcode表中有,而 jiayou表中没有的车辆呢,还有一个问题,我想把这个代码转成存储过程在程序中调用,可是不太会,请liangCk大哥帮忙。
liangCK 2012-06-13
  • 打赏
  • 举报
回复
--> 测试数据:@tb
declare @tb table([id] int,[teamid] int,[team] varchar(6),[carcode] varchar(5),[shuliang] numeric(7,4),[shijian] datetime)
insert @tb
select 1,1,'厂一队','00001',100.0000,'2012-6-12 0:00:00' union all
select 2,1,'厂一队','00001',200.0000,'2012-6-13 0:00:00' union all
select 3,2,'厂二队','00002',300.0000,'2012-6-12 0:00:00' union all
select 4,2,'厂二队','00002',400.0000,'2012-6-13 0:00:00' union all
select 5,1,'厂一队','00002',100.0000,'2012-6-12 0:00:00' union all
select 6,1,'厂一队','00002',200.0000,'2012-6-13 0:00:00' union all
select 7,3,'厂三队','00010',500.0000,'2012-6-12 0:00:00'

--SQL语句
--得到每个team,carcode的当天及累计数量
SELECT rowid=ROW_NUMBER() OVER(PARTITION BY teamid,team ORDER BY teamid),
teamid,team,carcode,
SUM(CASE WHEN shijian >= CONVERT(varchar(10),GETDATE(),120)
AND shijian < CONVERT(varchar(10),DATEADD(day,1,GETDATE()),120)
THEN shuliang ELSE 0 END) AS CurrentDay,
SUM(shuliang) AS total INTO #TMP
FROM @tb
GROUP BY teamid,team,carcode;


--得到一共有多少个team,并生成列字符串
DECLARE @s varchar(MAX);
SET @s='';

SELECT @s=@s+',MAX(CASE WHEN teamid='+RTRIM(teamid)+' THEN carcode ELSE '''' END) AS ['+team+']'
+',MAX(CASE WHEN teamid='+RTRIM(teamid)+' THEN RTRIM(CAST(CurrentDay AS numeric(12,2))) ELSE '''' END) AS [' + team+'_当天]'
+',MAX(CASE WHEN teamid='+RTRIM(teamid)+' THEN RTRIM(CAST(total AS numeric(12,2))) ELSE '''' END) AS [' + team+'_累计]'
FROM #TMP
GROUP BY teamid,team
ORDER BY teamid;

--执行
SET @s='SELECT '+STUFF(@s,1,1,'')+' FROM #TMP GROUP BY rowid';
PRINT @s;
EXEC(@s);

--删除临时表
DROP TABLE #TMP;


/*
厂一队 厂一队_当天 厂一队_累计 厂二队 厂二队_当天 厂二队_累计 厂三队 厂三队_当天 厂三队_累计
00001 200.00 300.00 00002 400.00 700.00 00010 0.00 500.00
00002 200.00 300.00
*/
liangCK 2012-06-13
  • 打赏
  • 举报
回复
如果你的team的数量是不固定的话, 还要用动态语句写。
@Rainbow.Sole 2012-06-13
  • 打赏
  • 举报
回复
要求的结果是有几个队就要有几个列的,最后查询效果应该是这样的:
厂一队 当日 累计 厂二队 当日 累计 厂三队 当日 累计
00001 200.0000 300.0000 00002 400.00 700.00 00010 0.00 500.00
00002 200.0000 300.0000
@Rainbow.Sole 2012-06-13
  • 打赏
  • 举报
回复
liangCK 大哥,数据如下,你帮我看下,谢谢。
id teamid team carcode shuliang shijian
1 1 厂一队 00001 100.0000 2012-6-12 0:00:00
2 1 厂一队 00001 200.0000 2012-6-13 0:00:00
3 2 厂二队 00002 300.0000 2012-6-12 0:00:00
4 2 厂二队 00002 400.0000 2012-6-13 0:00:00
5 1 厂一队 00002 100.0000 2012-6-12 0:00:00
6 1 厂一队 00002 200.0000 2012-6-13 0:00:00
7 3 厂三队 00010 500.0000 2012-6-12 0:00:00
liangCK 2012-06-13
  • 打赏
  • 举报
回复
要不你给点数据出来看看吧。
@Rainbow.Sole 2012-06-13
  • 打赏
  • 举报
回复
不太会排版,我得出的结果中,第三行 00002 400 700的数据是在二队下面的,但是上面有两个空行,不知道怎么解决了。
@Rainbow.Sole 2012-06-13
  • 打赏
  • 举报
回复
liangCK大哥的代码基本上可以解决问题了,可能是我描述的不太清楚,在单位下面显示的应该是车辆牌号的,我改了下可以取出我想要的数据,但是空行问题怎么解决啊。
以下是我改了以后的查询:
;WITH cte AS(
SELECT rowid=ROW_NUMBER() OVER(ORDER BY teamid)-1,
teamid,carcode,
SUM(CASE WHEN jiayoushijian >= CONVERT(varchar(10),GETDATE(),120)
AND jiayoushijian < CONVERT(varchar(10),DATEADD(day,1,GETDATE()),120)
THEN shuliang1 ELSE 0 END) AS 当天加油量,
SUM(shuliang1) AS 累计加油量
FROM report_youku
GROUP BY teamid,carcode
)
SELECT
MAX(CASE WHEN teamid = 1 THEN carcode ELSE '' END) AS 一队,
MAX(CASE WHEN teamid = 1 THEN RTRIM(当天加油量) ELSE '' END) AS 当天加油量一,
MAX(CASE WHEN teamid = 1 THEN RTRIM(累计加油量) ELSE '' END) AS 累计加油量一,
MAX(CASE WHEN teamid = 2 THEN carcode ELSE '' END) AS 二队,
MAX(CASE WHEN teamid = 2 THEN RTRIM(当天加油量) ELSE '' END) AS 当天加油量二,
MAX(CASE WHEN teamid = 2 THEN RTRIM(累计加油量) ELSE '' END) AS 累计加油量二
FROM cte
GROUP BY teamid,carcode

得出的结果如下:
一队 当日加油 累计加油 二队 当日加油 累计加油
00001 200.0000 300.0000
00002 200.0000 300.0000
00002 400.0000 700.0000

我想要得出这样的结果还要怎么进行处理:00001 00002车牌号

一队 当日加油 累计加油 二队 当日加油 累计加油
00001 200.0000 300.0000 00002 400.0000 700.0000
00002 200.0000 300.0000
liangCK 2012-06-13
  • 打赏
  • 举报
回复
;WITH cte AS(
SELECT rowid=ROW_NUMBER() OVER(ORDER BY 单位ID)-1,
单位ID,
SUM(CASE WHEN 加油时间 >= CONVERT(varchar(10),GETDATE(),120)
AND 加油时间 < CONVERT(varchar(10),DATEADD(day,1,GETDATE()),120)
THEN 加油数量 ELSE 0 END) AS 当天加油量,
SUM(加油数量) AS 累计加油量
FROM 单位表
GROUP BY 单位ID
)
SELECT
MAX(CASE WHEN rowid%2=0 THEN 单位ID ELSE '' END) AS 单位一,
MAX(CASE WHEN rowid%2=0 THEN RTRIM(当天加油量) ELSE '' END) AS 当天加油量一,
MAX(CASE WHEN rowid%2=0 THEN RTRIM(累计加油量) ELSE '' END) AS 累计加油量一,
MAX(CASE WHEN rowid%2=1 THEN 单位ID ELSE '' END) AS 单位二,
MAX(CASE WHEN rowid%2=1 THEN RTRIM(当天加油量) ELSE '' END) AS 当天加油量二,
MAX(CASE WHEN rowid%2=1 THEN RTRIM(累计加油量) ELSE '' END) AS 累计加油量二
FROM cte
GROUP BY rowid/2
昵称被占用了 2012-06-13
  • 打赏
  • 举报
回复
列出原始数据

34,593

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧