2013-01-17 1 views
0

J'utilise sql server 2008 r2. voici ma requête.besoin d'aide pour grouper mon résultat

SELECT TOP 25 A.*, U.Displayname AS UserName, 
      SU.Displayname AS SmoothieAuthorName, 
      S.Name AS SmoothieName, S.Id AS SmoothieId 
    FROM dbo.Activity AS A 
      LEFT JOIN dbo.[User] AS U ON A.UserId = U.Id 
      LEFT JOIN dbo.[User] AS SU ON A.SmoothieAuthorId = SU.Id 
      LEFT JOIN dbo.Smoothie AS S ON A.SmoothieId = S.Id 

    WHERE A.UserId = 2 [email protected] 
      AND A.UserId <> A.SmoothieAuthorId 
    ORDER BY CreatedDate DESC 

suivant est mon résultat. maintenant, j'ai besoin de les grouper par SmoothieId et CreatedDate (seulement la partie date du groupe, ignore le temps). Les deux premiers ne devraient en renvoyer qu'un, 3 à 5 ne devraient en retourner qu'un. Je ne sais pas comment le faire, s'il vous plaît aider.

Id ActionType UserId SmoothieId SmoothieAuthorId CreatedDate    UserName SmoothieAuthorName SmoothieName SmoothieId 
1 view  2  128   1     2013-01-15 20:05:03.403 mike  test1234   new testing 2d 128 
2 view  2  128   1     2013-01-15 20:16:24.733 mike  test1234   new testing 2d 128 
12 view  2  128   1     2013-01-16 21:45:56.167 mike  test1234   new testing 2d 128 
13 view  2  128   1     2013-01-16 22:12:51.217 mike  test1234   new testing 2d 128 
14 view  2  128   1     2013-01-16 22:12:54.407 mike  test1234   new testing 2d 128 
15 view  2  69   1     2013-01-16 22:19:54.783 mike  test1234   sdfsdfwww  69 
+0

Au lieu de A *, spécifiez uniquement les colonnes requises et assurez-vous qu'elles sont identiques, sauf pour les colonnes que vous vouliez 'GROUP BY', par exemple, Smoothield et CreatedDate. Et mentionnez-les tous dans la clause GROUP BY et pour la date, essayez GROUP BY CONVERT (DATE, CreatedDate) – Sunny

+0

J'ai besoin de tous les champs dans A – qinking126

+0

Voici ce que je voulais dire, considérons les deux premiers enregistrements, vous avez dit qu'un seul enregistrement doit être rempli. Mais id est 1 et 2, donc GROUP BY les traite comme deux enregistrements différents. Pensez à GROUP BY comme un seau où nous mettons des éléments qui ont les mêmes attributs. – Sunny

Répondre

1

Si vous avez besoin de TOUTES les colonnes de A incluant Id, je pense que vous aurez du mal à inclure Id. Je pense que vous aurez besoin de lister explicitement les colonnes de A que vous recherchez. J'ai également supposé que vous vouliez un nombre d'enregistrements que vous regroupez, d'où l'élément Count (TheDate).

Autre que cela, regardez getting just the date portion d'un datetime et le groupe sur cela.

Quelque chose comme;

SELECT ActionType, UserId, SmoothieId, SmoothieAuthorId, 
     TheDate, Count(TheDate) AS Occurances, UserName, SmoothieAuthorName, 
     SmoothieName, SmoothieId 
    FROM (
    SELECT TOP 25 A.ActionType, A.UserId, A.SmoothieId, 
      A.SmoothieAuthorId, 
      DATEADD(dd, 0, DATEDIFF(dd, 0, CreatedDate)) AS TheDate, 
      U.Displayname AS UserName, 
      SU.Displayname AS SmoothieAuthorName, 
      S.Name AS SmoothieName, S.Id AS SmoothieId 
    FROM dbo.Activity AS A 
      LEFT JOIN dbo.[User] AS U ON A.UserId = U.Id 
      LEFT JOIN dbo.[User] AS SU ON A.SmoothieAuthorId = SU.Id 
      LEFT JOIN dbo.Smoothie AS S ON A.SmoothieId = S.Id 
    WHERE A.UserId = 2 [email protected] 
      AND A.UserId <> A.SmoothieAuthorId 
    -- ORDER BY CreatedDate DESC 
) x GROUP BY ActionType, UserId, SmoothieId, SmoothieAuthorId, UserName, 
      TheDate, SmoothieAuthorName, SmoothieName, SmoothieId 
    ORDER BY The Date DESC 

Remarque Ce n'est pas testé, il est juste une suggestion rapide à ce que je vais essayer.

+0

cela fonctionne, je dois faire quelques petits changements, merci beaucoup – qinking126

+0

Pas de problèmes. Je suis content que cela fonctionne. –

0

Je ne suis pas sûr de bien comprendre la question. En supposant que vous voulez des valeurs distinctes pour ces colonnes, puis il suffit d'utiliser DISTINCT:

SELECT DISTINCT 
    CAST(CreatedDate to Date) as DateWanted, 
    SmoothieId 
FROM 
( 
    SELECT TOP 25 A.*, U.Displayname AS UserName, 
      SU.Displayname AS SmoothieAuthorName, 
      S.Name AS SmoothieName, S.Id AS SmoothieId 
    FROM dbo.Activity AS A 
      LEFT JOIN dbo.[User] AS U ON A.UserId = U.Id 
      LEFT JOIN dbo.[User] AS SU ON A.SmoothieAuthorId = SU.Id 
      LEFT JOIN dbo.Smoothie AS S ON A.SmoothieId = S.Id 
    WHERE A.UserId = 2 [email protected] 
      AND A.UserId <> A.SmoothieAuthorId 
) t 

Revoir votre commentaire, vous dites que vous avez besoin tous les champs de la table d'activité. Qu'attendez-vous de recevoir dans votre colonne Id pour les deux premiers enregistrements, 1 ou 2? Toutes les autres valeurs des autres colonnes sont-elles identiques? Pour obtenir un seul enregistrement, vous devez choisir une ligne par rapport à l'autre, ou faire un groupe avec les colonnes qui ont la même information.

Bonne chance.

Questions connexes