Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 使用总月日总订单按日期部分分组_Sql Server_Datetime_Group By - Fatal编程技术网

Sql server 使用总月日总订单按日期部分分组

Sql server 使用总月日总订单按日期部分分组,sql-server,datetime,group-by,Sql Server,Datetime,Group By,这是我的存储过程。。一个月内每天有多少新订单和旧订单。。 我要申报日期、订单总数和收入 结果我只得到一个月的最后一天,也就是31号。。我要按日计算的订单 alter Procedure sp_NewandOld ( @StartDate DATETIME, @EndDate DATETIME ) --[sp_NewandOld] '01/01/2015','01/31/2015' AS BEGIN ---New Customer Orders Breakup Decl

这是我的存储过程。。一个月内每天有多少新订单和旧订单。。 我要申报日期、订单总数和收入

结果我只得到一个月的最后一天,也就是31号。。我要按日计算的订单

alter Procedure sp_NewandOld
(
@StartDate  DATETIME,        
@EndDate  DATETIME
)
--[sp_NewandOld] '01/01/2015','01/31/2015'
AS 
BEGIN   
---New Customer Orders Breakup
Declare @NewCount int, @NewRevenue int, @NewDate nvarchar(50)
select @NewDate=(datepart(day,od.OrderDate)),
@NewCount= count(*), 
@NewRevenue= SUM(CONVERT(decimal(18,2),od.TotalAmount)) from orderdetails od 
inner join customer c on od.customerid=c.customerid 
where Convert(Datetime,Convert(varchar(50),od.orderdate,101)) = Convert(Datetime,Convert(varchar(50),c.registereddate,101))
and Convert(Datetime,convert(varchar(50),od.orderdate,101)) between @StartDate and @EndDate
group by datepart(day, od.OrderDate)


Declare @OldCount int, @OldRevenue int, @OldDate nvarchar(50)
select @OldDate=(datepart(day,od.OrderDate)),
@OldCount= count(*), 
@OldRevenue=SUM(CONVERT(decimal(18,2),od.TotalAmount)) from orderdetails od 
inner join  customer c on od.customerid=c.customerid 
where Convert(Datetime,Convert(varchar(50),od.orderdate,101)) != Convert(Datetime,Convert(varchar(50),c.registereddate,101))
and Convert(Datetime,convert(varchar(50),od.orderdate,101)) between @StartDate and @EndDate
group by datepart(day, od.OrderDate)

select @NewDate,@NewCount,@OldCount,@NewRevenue,@OldRevenue
End

您只选择变量中的第一行值,并且需要获取所有值。将查询更改为此以获取所有数据:

alter Procedure sp_NewandOld (
    @StartDate  DATETIME,        
    @EndDate  DATETIME
)
AS 
BEGIN   

    with [new] as (
        select  datepart(month,od.OrderDate) as newdatemonth,
                datepart(day,od.OrderDate) as newdate,
                count(*) as NewCount, 
                SUM(CONVERT(decimal(18,2),od.TotalAmount)) as NewRevenue
        from orderdetails od 
        inner join customer c 
            on od.customerid=c.customerid 
        where Convert(Datetime,Convert(varchar(50),od.orderdate,101)) = Convert(Datetime,Convert(varchar(50),c.registereddate,101))
        and Convert(Datetime,convert(varchar(50),od.orderdate,101)) between @StartDate and @EndDate
        group by datepart(month,od.OrderDate), datepart(day, od.OrderDate)
    ), [old] as (
        select  datepart(month,od.OrderDate) as OldDateMonth,
                datepart(day,od.OrderDate) as OldDate,
                count(*) as OldCount, 
                SUM(CONVERT(decimal(18,2),od.TotalAmount)) as OldRevenue
        from orderdetails od 
        inner join customer c 
            on od.customerid=c.customerid 
        where Convert(Datetime,Convert(varchar(50),od.orderdate,101)) != Convert(Datetime,Convert(varchar(50),c.registereddate,101))
        and Convert(Datetime,convert(varchar(50),od.orderdate,101)) between @StartDate and @EndDate
        group by datepart(month,od.OrderDate) , datepart(day, od.OrderDate)
    )

    select  n.newdatemonth,
            n.NewDate,
            n.NewCount,
            o.OldCount,
            n.NewRevenue,
            o.OldRevenue
    from [new] n
    inner join [old] o
        on n.newdate = o.olddate and n.newdatemonth = o.OldDateMonth

End

您只选择变量中的第一行值,并且需要获取所有值。将查询更改为此以获取所有数据:

alter Procedure sp_NewandOld (
    @StartDate  DATETIME,        
    @EndDate  DATETIME
)
AS 
BEGIN   

    with [new] as (
        select  datepart(month,od.OrderDate) as newdatemonth,
                datepart(day,od.OrderDate) as newdate,
                count(*) as NewCount, 
                SUM(CONVERT(decimal(18,2),od.TotalAmount)) as NewRevenue
        from orderdetails od 
        inner join customer c 
            on od.customerid=c.customerid 
        where Convert(Datetime,Convert(varchar(50),od.orderdate,101)) = Convert(Datetime,Convert(varchar(50),c.registereddate,101))
        and Convert(Datetime,convert(varchar(50),od.orderdate,101)) between @StartDate and @EndDate
        group by datepart(month,od.OrderDate), datepart(day, od.OrderDate)
    ), [old] as (
        select  datepart(month,od.OrderDate) as OldDateMonth,
                datepart(day,od.OrderDate) as OldDate,
                count(*) as OldCount, 
                SUM(CONVERT(decimal(18,2),od.TotalAmount)) as OldRevenue
        from orderdetails od 
        inner join customer c 
            on od.customerid=c.customerid 
        where Convert(Datetime,Convert(varchar(50),od.orderdate,101)) != Convert(Datetime,Convert(varchar(50),c.registereddate,101))
        and Convert(Datetime,convert(varchar(50),od.orderdate,101)) between @StartDate and @EndDate
        group by datepart(month,od.OrderDate) , datepart(day, od.OrderDate)
    )

    select  n.newdatemonth,
            n.NewDate,
            n.NewCount,
            o.OldCount,
            n.NewRevenue,
            o.OldRevenue
    from [new] n
    inner join [old] o
        on n.newdate = o.olddate and n.newdatemonth = o.OldDateMonth

End

请编辑您的问题,使其包含样本数据和期望结果。请编辑您的问题,使其包含样本数据和期望结果。这是可行的,但我有新计数百分比和旧计数百分比。。我应该在哪里提到???您可以将此添加到查询中,您想使用什么公式?我在上面提到的查询中添加了每天的总计数..现在我想要每天新计数和旧计数的百分比。。。如果新计数:12,旧计数:13,总数:25,现在我要百分比???(12/30)*100??? 是正确的吗?(12/25)*100我想((o.OldCount*100)/t.TotalCount)像这样工作。。我在select语句中提到了…它是worikng,但我有新计数百分比和旧计数百分比。。我应该在哪里提到???您可以将此添加到查询中,您想使用什么公式?我在上面提到的查询中添加了每天的总计数..现在我想要每天新计数和旧计数的百分比。。。如果新计数:12,旧计数:13,总数:25,现在我要百分比???(12/30)*100??? 是正确的吗?(12/25)*100我想((o.OldCount*100)/t.TotalCount)像这样工作。。我在select语句中提到。。。