0

这是我在这里的第一篇文章,所以如果我被误认为是我的帖子和英语,我说抱歉:)

我已经在谷歌做过研究,不幸的是直到现在我都无法解决这个问题。

这是我的问题,按日期显示每个产品的总订单,我想按产品区分

这是我的查询示例

SELECT Orders.OrderDate
          ,SUM(OrderDetails.OrderDetailQuantity) AS totalOrdered
          ,Products.ProductId 
FROM Orders 
INNER JOIN OrderDetails ON Orders.OrderId = OrderDetails.OrderId 
INNER JOIN Products ON OrderDetails.ProductId = Products.ProductId 
GROUP BY Orders.OrderId
          ,Orders.OrderDate
          ,Products.ProductId 
HAVING (CONVERT(VARCHAR,  Orders.OrderDate, 23) BETWEEN @from AND @to)

现在,我想根据 OrderDate 之间的产品来区分,我知道这里的大问题是 DATE,但我不知道如何通过这个查询区分日期。

请帮我。谢谢你。

PS:如果你想在 linq 表达式中解决这个问题,它会被高度接受:)

4

1 回答 1

1

样本数据和期望的结果会有所帮助。当你说“distinct by”时,我假设你的意思是 group by。请注意,在 WHERE 子句中,如果您确保 @from 和 @to 参数的时间组件设置正确(包括每一天),则不需要强制转换 Order.OrderDate。在比较的左侧应用强制转换操作绝不是一个好主意。

SELECT  --cast(Orders.OrderDate as date),
        Products.ProductId 
        SUM(OrderDetails.OrderDetailQuantity) AS totalOrdered,
FROM Orders 
INNER JOIN OrderDetails ON Orders.OrderId = OrderDetails.OrderId 
INNER JOIN Products ON OrderDetails.ProductId = Products.ProductId 
where Orders.OrderDate between cast(@from as date) AND cast(@to as date)
GROUP 
BY      --cast(Orders.OrderDate as date),
        Products.ProductId 


-- to illustrate:
declare @From datetime = '1/1/2000 10:30:22',
        @To datetime = '1/3/2000 9:11:31'

declare @orders table (i int, dt datetime)
insert into @orders
    values(1, '1/1/2000 8:00'),(2, '1/2/2000 10:00'), (3, '1/4/2000 3:00')


-- only returns i=2
select *
from    @orders
where dt between @From and @To

-- returns i=1 & i=2
select *
from    @orders
where dt between cast(@From as date) and cast(@To as date)
于 2012-05-04T21:59:01.467 回答