2010-01-04 6 views
1

Si nous commençons par l'instruction SQL simple suivante qui fonctionne. FPartNo est le numéro de pièce et le FunetPrix est évidemment le prix net. L'utilisateur veut également la description et cela provoque un problème. Si je suis avec ceci:Fonctions agrégées et groupes par problèmes

SELECT sor.FPARTNO, sor.fdesc, sum(sor.FUNETPRICE) 
FROM sorels sor 
GROUP BY sor.FPARTNO, sor.fdesc 

S'il y a des variations multiples de la description pour ce numéro de pièce, généralement de très faibles variations dans le texte, alors je ne suis pas réellement ensemble sur le numéro de pièce. Avoir du sens? Je suis sûr que cela doit être simple. Comment puis-je retourner le premier fdesc correspondant au numéro de pièce? Chacune des variantes de description suffirait car elles sont presque entièrement identiques.

Éditer: La description est un champ de texte.

Répondre

4

Si vous ne pouvez pas mettre à niveau vers SQL Server 2005 pour une (max) type :-)

essayer. SUBSTRING fonctionne sur blobs, mais renvoie varchar pour le texte. Ainsi, l'ensemble devrait fonctionner et vous perdez des données

SELECT 
    sor.FPARTNO, MIN(SUBSTRING(sor.fdesc, 1, 8000)), sum(sor.FUNETPRICE) 
FROM 
    sorels sor 
GROUP BY 
    sor.FPARTNO, SUBSTRING(sor.fdesc, 1, 8000) 
+1

N'avez-vous pas encore besoin d'utiliser MIN ou MAX, sinon vous obtiendrez des groupes faux? – recursive

+0

oups! réparé maintenant – gbn

0

Avez-vous essayé

SELECT sor.FPARTNO, MIN(sor.fdesc), sum(sor.FUNETPRICE) 
FROM sorels sor 
GROUP BY sor.FPARTNO 

Ou même MAX peut faire.

Essayez de caster le champ NTEXT

DECLARE @sorels TABLE(
     FPARTNO INT, 
     fdesc NTEXT, 
     FUNETPRICE FLOAT 
) 

SELECT sor.FPARTNO, MIN(CAST(sor.fdesc AS VARCHAR(4000))), sum(sor.FUNETPRICE) 
FROM @sorels sor 
GROUP BY sor.FPARTNO 
+0

J'ai essayé Max et juste maintenant essayé min, et a reçu l'erreur suivante: erreur \t base de données SQL Server Erreur: Le texte, ntext et types de données d'image sont invalides dans cette expression de sous-requête ou d'agrégat. – DavidStein

+0

Quel est le type de ** sor.fdesc **? –

+0

sor.fdesc est un champ de texte comme je l'ai dit plus haut dans ma précédente édition. :) – DavidStein

0

N'a pas eu la chance de le tester, mais il devrait être proche. Si vous utilisiez SQL Server 2005, il serait beaucoup plus propre avec les CTE.

SELECT agg.FPARTNO, 
     (SELECT TOP 1 inner.FDESC FROM sorels inner WHERE inner.FPARTNO = agg.FPARTNO) FDESC, 
     agg.FUNETPRICESUM 
FROM (SELECT sor.FPARTNO, 
       sum(sor.FUNETPRICE) FUNETPRICESUM 
     FROM sorels sor 
     GROUP BY sor.FPARTNO) agg 
+0

Inner est un mot réservé, je crois. – DavidStein

Questions connexes