sql 按照小时分组查询并统计
发布网友
发布时间:2022-04-11 14:28
我来回答
共6个回答
热心网友
时间:2022-04-11 15:57
-- 模拟销售的表.
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 行受影响)
这样行么?
热心网友
时间:2022-04-11 17:15
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_CostUMERIC (18, 2),
Total_AmountUMERIC (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 日期参数;
热心网友
时间:2022-04-11 18:50
这个用查询语句是做不出来的
需要用游标
思路:
定义游标:查询你需要的字段及范围,记得按时间排序
返回一张临时表
变量,当前时段
逐行:
若该记录的时段与变量的当前时段相同,将临时表中的对应时段数据进行 行的累加(或平均数等操作)
若该记录的时段与变量的当前时段不同,在临时表中新增一个时段,将该数据一同新增进去
结束的话就你要的东西了追问那我如何将数据绑定到DataGridView中呢?
追答上述操作最终得到一个 临时表
然后用语句 select * from 临时表,便可形成一个DataTable / DataSet 就可以直接绑定到你grid上了
热心网友
时间:2022-04-11 20:41
用一句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'
依次类推
热心网友
时间:2022-04-11 22:49
select datepart(hh,[销售时间]), as [销售时段],sum([销量]) as [销量],sum([实销]) as[实销],sum([累计实销]) as [累计实销],sum([成本]) as [成本],sum( [毛利])as [毛利]
from [销售表]
group by datepart(hh,[销售时间]),
热心网友
时间:2022-04-12 01:14
分组查询语句如下:
SELECT column_name, aggregate_function(column_name)
FROM table_name
WHERE column_name operator value
GROUP BY column_name
统计查询语句如下:
select sum(column_name)
from table_name
where column_name operator value追问拜托,请看清上边的效果图OK?你这种分组查询是无法实现那种效果的,还有可能是我没说清楚,我要的统计是在查询结果最后一行显示成例如:“合计:1 2 25 36”对那一列的合计