我正在为餐厅/酒吧开发仪表板。
我想操纵日期,例如:
如果他们在01月1日02:30卖东西。 此金额应加到1月1日的金额,而不是1月2日的金额。 所以基本上在00:00到03:59的第二天,他们卖出的金额应该加到上一个日期。
目前我的SQL查询只显示两个日期,但我希望它分为1个日期。如果使用SQL无法做到这一点,我在PHP中使用了我的仪表板,因此如果有人能提供给我这些信息,我最终可以在PHP中操作它。
我的查询
select CONVERT(CHAR(10), receiptdatetime, 120), datename(DW,receiptdatetime),
sum(rld.NetAmount), count(rl.ReceiptId)
from receipt r, receiptline rl, vw_ReceiptLineDetail rld
where rl.ReceiptId = r.ReceiptId and
rl.ModifiedKind != 300
and rld.ReceiptLineId = rl.ReceiptLineId and
receiptdatetime <= DATEADD(HOUR,4,DATEADD(DAY,1, '01/01/2018'))
and receiptdatetime >= DATEADD(HOUR,4,'01/01/2018')
group by CONVERT(CHAR(10), receiptdatetime, 120), datename(DW, receiptdatetime)
order by 1
所以当前的输出是这样的(缩短的):
Date Amount
1 01/01/2018 100
2 02/01/2018 20
但我希望它像这样
Date Amount
1 01/01/2018 120
答案 0 :(得分:1)
您可以使用此查询并根据需要使用日期
这是第一个为您提供结果的查询
select CONVERT(CHAR(10), receiptdatetime, 120), datename(DW,receiptdatetime),
sum(rld.NetAmount), count(rl.ReceiptId)
from receipt r, receiptline rl, vw_ReceiptLineDetail rld
where rl.ReceiptId = r.ReceiptId and
rl.ModifiedKind != 300
and rld.ReceiptLineId = rl.ReceiptLineId and
receiptdatetime <= DATEADD(HOUR,4,DATEADD(DAY,1, '01/01/2018'))
and receiptdatetime >= DATEADD(HOUR,4,'01/01/2018')
group by CONVERT(CHAR(10), receiptdatetime, 120), datename(DW, receiptdatetime)
order by 1
您可以将此结果用作第一个选择:
With CTE as
(
select CONVERT(CHAR(10), receiptdatetime, 120), datename(DW,receiptdatetime),
sum(rld.NetAmount), count(rl.ReceiptId)
from receipt r, receiptline rl, vw_ReceiptLineDetail rld
where rl.ReceiptId = r.ReceiptId and
rl.ModifiedKind != 300
and rld.ReceiptLineId = rl.ReceiptLineId and
receiptdatetime <= DATEADD(HOUR,4,DATEADD(DAY,1, '01/01/2018'))
and receiptdatetime >= DATEADD(HOUR,4,'01/01/2018')
group by CONVERT(CHAR(10), receiptdatetime, 120), datename(DW, receiptdatetime)
order by 1
)
所以像这样你将结果存储在名为CTE的表中 不,我没有数据,所以我将创建我的owne变量表来存储您从第一个查询获得的结果,您可以使用您的CTE tabale作为@Table的源实例
Declare @Table table (
id int,
dates date,
amout int
)
insert into @Table
select 1 , '2018-01-01' , 100 union
select 2 , '2018-01-02' , 20 union
select 2 , '2018-02-02' , 200 union
select 2 , '2018-01-03' , 20 union
select 2 , '2018-01-04' , 20
现在让Amout得到你想要的结果就是要使用的查询 你从CTE中选择:
select sum(amout) as Amout from @Table
where dates between '2018-01-01' and '2018-01-04'
Result :
Amout
160
现在您将使用该结果并将其与您的表联合以获取您想要的ID和您想要的日期,并且我应该将最后一个表日期转换为nvarchar(50),这样您将获得此结果< / p>
1-当你整整一个月
ID Date Amout
1 2018-01 160
2-按时间表执行
ID Date Amout
1 '2018-01-01 2018-01-14' 160
你可以从你想要的硬编码ID和日期开始,并且联合到你从查询得到的结果Amout 或者您可以使用变量来配置要使用Amout
显示的ID和日期谢谢你,如果你有任何问题,我在这里已经完成了对我本地的测试而且它有效,我希望这就是你需要的东西:)
答案 1 :(得分:0)
使用:
;With CTE as ( select (RowCount() Over (Partition by Date order by id) row_count) , date, amout
from tables and where conditions
然后在选择中将具有相同日期的金额添加到彼此中 从CTE表中选择
如果您想在同一个月添加全天的金额,请选择仅在年份和月份上的日期列,然后在此日期之前执行分区