Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Eindeutig nach Bestelldatum und Produkten SQL Server 2008

Beispieldaten und gewünschte Ergebnisse würden helfen. Wenn Sie "eindeutig durch" sagen, meinen Sie vermutlich Gruppieren nach. Beachten Sie, dass Sie in der WHERE-Klausel Order.OrderDate nicht umwandeln müssen, wenn Sie sicherstellen, dass die Zeitkomponente Ihrer @from- und @to-Parameter richtig eingestellt ist (um jeden ganzen Tag einzuschließen). Es ist nie eine gute Idee, eine Cast-Operation auf die linke Seite eines Vergleichs anzuwenden.

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)