sql 按照小时分组查询并统计
我现在想做一个报表:实现如下效果,我想问下如何用SQL语句来完成这样的效果。并在最后一行进行合计。这里边的“销售时段”是按照时间点来分的在线坐等回复!...
我现在想做一个报表:实现如下效果,
我想问下如何用SQL语句来完成这样的效果。并在最后一行进行合计。这里边的“销售时段”是按照时间点来分的 在线坐等回复! 展开
我想问下如何用SQL语句来完成这样的效果。并在最后一行进行合计。这里边的“销售时段”是按照时间点来分的 在线坐等回复! 展开
6个回答
推荐于2016-03-06
展开全部
-- 模拟销售的表.
CREATE TABLE #temp (
[销售时间] datetime,
[销量] int,
[实销] int
)
go
-- 由于 成本与毛利, 我估计应该是在另外一个表里面的, 这里就不模拟了
INSERT INTO #temp
-- 9点的
SELECT '2013-07-16 09:55:15', 9, 900 UNION ALL
-- 10点的
SELECT '2013-07-16 10:15:15', 1, 100 UNION ALL
SELECT '2013-07-16 10:25:15', 15, 1500 UNION ALL
SELECT '2013-07-16 10:35:15', 10, 1000 UNION ALL
-- 11点的
SELECT '2013-07-16 11:15:15', 1, 100 UNION ALL
SELECT '2013-07-16 11:25:15', 2, 200 UNION ALL
SELECT '2013-07-16 11:35:15', 3, 300 UNION ALL
SELECT '2013-07-16 11:45:15', 4, 400 UNION ALL
SELECT '2013-07-16 11:55:15', 5, 500 UNION ALL
-- 其他的.
SELECT '2013-07-16 12:15:15', 12, 1200 UNION ALL
SELECT '2013-07-16 13:15:15', 13, 1300 UNION ALL
SELECT '2013-07-16 14:15:15', 14, 1400 UNION ALL
-- 中间缺少 15点与16点的
SELECT '2013-07-16 17:15:15', 17, 1700 UNION ALL
SELECT '2013-07-16 18:15:15', 18, 1800;
go
SELECT
ISNULL(Convert(varchar(2), sv.number) + '-' + Convert(varchar(2), sv.number + 1), '合计') AS [销售时段],
SUM([销量]) AS [销量],
SUM([实销]) AS [实销],
(SELECT SUM([实销]) FROM #temp t2 WHERE DATEPART(hh, t2.[销售时间]) <= ISNULL(sv.number, 23) ) AS [累计实销]
FROM
master..spt_values sv
JOIN #temp t
ON (sv.number = DATEPART(hh, t.[销售时间]))
WHERE
sv.type='P'
AND sv.number >=9
AND sv.number <20
GROUP BY
sv.number WITH rollup
GO
销售时段 销量 实销 累计实销
----- ----------- ----------- -----------
9-10 9 900 900
10-11 26 2600 3500
11-12 15 1500 5000
12-13 12 1200 6200
13-14 13 1300 7500
14-15 14 1400 8900
17-18 17 1700 10600
18-19 18 1800 12400
合计 124 12400 12400
(9 行受影响)
这样行么?
更多追问追答
追问
子查询返回的值不止一个。当子查询跟随在 =、!=、、>= 之后,或子查询用作表达式时,这种情况是不允许的 为何我将语句中的表名和字段替换后出现这个错误?
追答
你语句怎么写的啊?
不行你就把你的表结构全部粘贴出来。
否则我光看你这个错误提示。
没表结构, 没 SQL 语句的。 想帮忙也帮不上啊!
展开全部
1、创建表Sale_Order 主键Order_No,这个表存储日常的销售数据;
CREATE TABLE dbo.SALE_ORDER
(
Order_No NVARCHAR (6) NOT NULL,
Sale_Date DATETIME,
Sale_Qty INT,
Sale_Amount UMERIC (18, 2),
Sale_Cost UMERIC (18, 2),
CONSTRAINT PK_Comm_Area PRIMARY KEY (Order_No)
);
GO
2、创建存储过程up_Sale_Gross_Profit 获取需要的结果;
CREATE PROCEDURE dbo.up_Sale_Gross_Profit
(
@SaleDate DATETIME--日期条件
)
WITH EXECUTE AS 'dbo'
AS
BEGIN
--创建承载明细账的临时表,这里可以通过很多查询方法实现,
--不过通过临时表可以充分利用Update的游标功能提升查询性能,数据量越大性能提升的就越明显;
CREATE TABLE #temp_Sale_Gross_Profit
(
Period NVARCHAR (6) NOT NULL,
Sale_Qty INT,
Sale_Amount UMERIC (18, 2),
Sale_Cost UMERIC (18, 2),
Total_Amount UMERIC (18, 2),
Total_Cost UMERIC (18, 2),
Gross_Profit UMERIC (18, 2)
);
--获取指定销售时段的销量与实销数,这里销售时段按小时计算
Insert Into #temp_Sale_Gross_Profit
Select convert(VARCHAR(10),DatePart(hh,Sale_Date))+'-'+convert(VARCHAR(10),DatePart(hh,Sale_Date)+1),
SUM(Sale_Qty),SUM(Sale_Amount),SUM(Sale_Cost),0,0,0
From SALE_ORDER Where Sale_Date = @SaleDate
Group By DatePart(hh,Sale_Date)
Order By DatePart(hh,Sale_Date);
--定义累计实销与累计成本的变量
Declaer @Total_Amount UMERIC (18, 2);
Declaer @Total_Cost UMERIC (18, 2);
Set @Total_Amount = 0;
Set @Total_Cost = 0 ;
--利用Update游标计算结果(很神奇不是吗?呵呵)
Update #temp_Sale_Gross_Profit
Set @Total_Amount = @Total_Amount + Sale_Amount,
@Total_Cost = @Total_Cost + Sale_Cost,
Total_Amount = @Total_Amount,
Total_Cost = @Total_Cost,
Gross_Profit = @Total_Amount - @Total_Cost;
--获取结果
Select Period 销售时段,
Sale_Qty 销量,
Sale_Amount 实销,
Total_Amount 累计实销,
Total_Cost 成本,
Gross_Profit 毛利
From #temp_Sale_Gross_Profit;
DROUP TABLE temp_Sale_Gross_Profit;
END
GO
3、程序里调用该存储过程就行了
Exec up_Sale_Gross_Profit 日期参数;
CREATE TABLE dbo.SALE_ORDER
(
Order_No NVARCHAR (6) NOT NULL,
Sale_Date DATETIME,
Sale_Qty INT,
Sale_Amount UMERIC (18, 2),
Sale_Cost UMERIC (18, 2),
CONSTRAINT PK_Comm_Area PRIMARY KEY (Order_No)
);
GO
2、创建存储过程up_Sale_Gross_Profit 获取需要的结果;
CREATE PROCEDURE dbo.up_Sale_Gross_Profit
(
@SaleDate DATETIME--日期条件
)
WITH EXECUTE AS 'dbo'
AS
BEGIN
--创建承载明细账的临时表,这里可以通过很多查询方法实现,
--不过通过临时表可以充分利用Update的游标功能提升查询性能,数据量越大性能提升的就越明显;
CREATE TABLE #temp_Sale_Gross_Profit
(
Period NVARCHAR (6) NOT NULL,
Sale_Qty INT,
Sale_Amount UMERIC (18, 2),
Sale_Cost UMERIC (18, 2),
Total_Amount UMERIC (18, 2),
Total_Cost UMERIC (18, 2),
Gross_Profit UMERIC (18, 2)
);
--获取指定销售时段的销量与实销数,这里销售时段按小时计算
Insert Into #temp_Sale_Gross_Profit
Select convert(VARCHAR(10),DatePart(hh,Sale_Date))+'-'+convert(VARCHAR(10),DatePart(hh,Sale_Date)+1),
SUM(Sale_Qty),SUM(Sale_Amount),SUM(Sale_Cost),0,0,0
From SALE_ORDER Where Sale_Date = @SaleDate
Group By DatePart(hh,Sale_Date)
Order By DatePart(hh,Sale_Date);
--定义累计实销与累计成本的变量
Declaer @Total_Amount UMERIC (18, 2);
Declaer @Total_Cost UMERIC (18, 2);
Set @Total_Amount = 0;
Set @Total_Cost = 0 ;
--利用Update游标计算结果(很神奇不是吗?呵呵)
Update #temp_Sale_Gross_Profit
Set @Total_Amount = @Total_Amount + Sale_Amount,
@Total_Cost = @Total_Cost + Sale_Cost,
Total_Amount = @Total_Amount,
Total_Cost = @Total_Cost,
Gross_Profit = @Total_Amount - @Total_Cost;
--获取结果
Select Period 销售时段,
Sale_Qty 销量,
Sale_Amount 实销,
Total_Amount 累计实销,
Total_Cost 成本,
Gross_Profit 毛利
From #temp_Sale_Gross_Profit;
DROUP TABLE temp_Sale_Gross_Profit;
END
GO
3、程序里调用该存储过程就行了
Exec up_Sale_Gross_Profit 日期参数;
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
这个用查询语句是做不出来的
需要用游标
思路:
定义游标:查询你需要的字段及范围,记得按时间排序
返回一张临时表
变量,当前时段
逐行:
若该记录的时段与变量的当前时段相同,将临时表中的对应时段数据进行 行的累加(或平均数等操作)
若该记录的时段与变量的当前时段不同,在临时表中新增一个时段,将该数据一同新增进去
结束的话就你要的东西了
需要用游标
思路:
定义游标:查询你需要的字段及范围,记得按时间排序
返回一张临时表
变量,当前时段
逐行:
若该记录的时段与变量的当前时段相同,将临时表中的对应时段数据进行 行的累加(或平均数等操作)
若该记录的时段与变量的当前时段不同,在临时表中新增一个时段,将该数据一同新增进去
结束的话就你要的东西了
追问
那我如何将数据绑定到DataGridView中呢?
追答
上述操作最终得到一个 临时表
然后用语句 select * from 临时表,便可形成一个DataTable / DataSet 就可以直接绑定到你grid上了
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
用一句SQL语句完成似乎不太可能。
select '9-10' as 销售时段,sum(销量) as 销量,sum(实销) as实销,sum(累计实销) as 累计实销),sum(成本) as成本, sum( 毛利) as 毛利 from 销售表 where time>='9' and time<'10'
union
select '9-10' as 销售时段,sum(销量) as 销量,sum(实销) as实销,sum(累计实销) as 累计实销),sum(成本) as成本, sum( 毛利) as 毛利 from 销售表 where time>='10' and time<'11'
依次类推
select '9-10' as 销售时段,sum(销量) as 销量,sum(实销) as实销,sum(累计实销) as 累计实销),sum(成本) as成本, sum( 毛利) as 毛利 from 销售表 where time>='9' and time<'10'
union
select '9-10' as 销售时段,sum(销量) as 销量,sum(实销) as实销,sum(累计实销) as 累计实销),sum(成本) as成本, sum( 毛利) as 毛利 from 销售表 where time>='10' and time<'11'
依次类推
更多追问追答
追问
大哥十二个时段,我就要写上12条查询语句,让后再将查询的结果分别放入list中,最后绑定到dataGridView中,这效率也太慢了吧,并且还增加代码量,有没有简单的方法
追答
你的时间格式给我发一个,有可能有简便的方法
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
select datepart(hh,[销售时间]), as [销售时段],sum([销量]) as [销量],sum([实销]) as[实销],sum([累计实销]) as [累计实销],sum([成本]) as [成本],sum( [毛利])as [毛利]
from [销售表]
group by datepart(hh,[销售时间]),
from [销售表]
group by datepart(hh,[销售时间]),
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询