sql 按照小时分组查询并统计

我现在想做一个报表:实现如下效果,我想问下如何用SQL语句来完成这样的效果。并在最后一行进行合计。这里边的“销售时段”是按照时间点来分的在线坐等回复!... 我现在想做一个报表:实现如下效果,

我想问下如何用SQL语句来完成这样的效果。并在最后一行进行合计。这里边的“销售时段”是按照时间点来分的 在线坐等回复!
展开
 我来答
匿名用户
推荐于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 语句的。 想帮忙也帮不上啊!
newzfj
2013-07-16 · 超过17用户采纳过TA的回答
知道答主
回答量:74
采纳率:0%
帮助的人:27万
展开全部
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 日期参数;
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
清水栞
2013-07-16 · TA获得超过1547个赞
知道小有建树答主
回答量:1538
采纳率:50%
帮助的人:980万
展开全部
这个用查询语句是做不出来的
需要用游标

思路:
定义游标:查询你需要的字段及范围,记得按时间排序

返回一张临时表

变量,当前时段

逐行:
若该记录的时段与变量的当前时段相同,将临时表中的对应时段数据进行 行的累加(或平均数等操作)
若该记录的时段与变量的当前时段不同,在临时表中新增一个时段,将该数据一同新增进去

结束的话就你要的东西了
追问
那我如何将数据绑定到DataGridView中呢?
追答
上述操作最终得到一个 临时表

然后用语句 select * from 临时表,便可形成一个DataTable / DataSet 就可以直接绑定到你grid上了
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
hhygc
2013-07-16 · TA获得超过888个赞
知道小有建树答主
回答量:423
采纳率:100%
帮助的人:226万
展开全部
用一句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'
依次类推
更多追问追答
追问
大哥十二个时段,我就要写上12条查询语句,让后再将查询的结果分别放入list中,最后绑定到dataGridView中,这效率也太慢了吧,并且还增加代码量,有没有简单的方法
追答
你的时间格式给我发一个,有可能有简便的方法
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
百度网友a800768
2013-07-16 · TA获得超过1841个赞
知道大有可为答主
回答量:1928
采纳率:0%
帮助的人:1722万
展开全部
select datepart(hh,[销售时间]), as [销售时段],sum([销量]) as [销量],sum([实销]) as[实销],sum([累计实销]) as [累计实销],sum([成本]) as [成本],sum( [毛利])as [毛利]
from [销售表]
group by datepart(hh,[销售时间]),
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(4)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式