4 votes

Grouper par date dans SQL Server

J'ai un problème avec le regroupement dans SQL Server.

J'ai un datetime mais je veux grouper uniquement par date,

Voici mon code

SELECT ProductCode,
       ProductName,
       ProductType,
       UnitPrice,QTY,
       Amount,
       (convert(varchar, TransactionDate, 101) )AS sTransactionDate
FROM DailyTransactions 
GROUP BY TransactionDate, ProductCode,
          ProductName,ProductType,UnitPrice,QTY,Amount

RÉSULTAT :

2/17/2012 apparaît trois fois parce qu'il a des temps différents ...

2voto

John Pick Points 3514

Vous pouvez essayer :

GROUP BY
  DATEPART(year, TransactionDate),
  DATEPART(month, TransactionDate),
  DATEPART(day, TransactionDate)

2voto

Bruno Silva Points 2406

Cela devrait vous permettre de regrouper rapidement vos résultats par date :

SELECT  
   ProductCode,ProductName,ProductType,UnitPrice,QTY,Amount,(convert(varchar, TransactionDate, 101) )AS sTransactionDate
   FROM DailyTransactions 
   GROUP BY DATEADD(day, DATEDIFF(day, 0, TransactionDate), 0), ProductCode,ProductName,ProductType,UnitPrice,QTY,Amount

Dans ce cas, nous obtenons la différence entre le début de la journée et l'heure de la date, puis nous la supprimons.

2voto

John Woo Points 132738

Puisque vous ne voulez afficher qu'un seul résultat, pourquoi ne pas utiliser DISTINCT ?

SELECT DISTINCT ProductCode, ...
FROM ...
GROUP BY ProductCode

2voto

nealkernohan Points 309

En d'autres termes, votre GROUP BY doit apparaître quelque part dans votre sélection. Vous convertissez déjà TransactionDate en une chaîne "date uniquement", bien que DATEADD et DATEDIFF soient en fait plus efficaces ensemble.

Il suffit donc de GROUPER PAR le même format :

SELECT ProductCode,
       ProductName,
       ProductType,
       UnitPrice,QTY,
       Amount,
       DATEADD(day, DATEDIFF(day, 0, TransactionDate), 0) AS sTransactionDate
FROM DailyTransactions 
GROUP BY DATEADD(day, DATEDIFF(day, 0, TransactionDate), 0), ProductCode,
          ProductName,ProductType,UnitPrice,QTY,Amount

1voto

Aaron Bertrand Points 116343

Essayez d'utiliser CHAR(10) au lieu de varchar lorsque vous appliquez votre conversion. Vous ne devriez jamais déclarer un char/varchar sans longueur. Dans ce cas, vous ne tronquez pas suffisamment de caractères car il s'agit d'un varchar(30) alors que vous ne vous intéressez qu'aux 10 premiers caractères. De plus, votre group by doit inclure un convert identique.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X