Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Distinct par date de commande et produits SQL Server 2008

Des exemples de données et les résultats souhaités seraient utiles. Lorsque vous dites "distinct par", je suppose que vous voulez dire par groupe. Notez que dans la clause WHERE, vous n'avez pas besoin de caster Order.OrderDate si vous vous assurez que le composant de temps de vos paramètres @from &@to est correctement défini (pour inclure chaque jour entier). Ce n'est jamais une bonne idée d'appliquer une opération de cast au côté gauche d'une comparaison.

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)