2009-02-26 6 views
0

alt text http://agricam.net/test.gifSql Groupement

Je dois ajouter une ligne dynamique dans SQL après le numéro de Marketer change avec l'en-tête « Marketer Total » qui devrait ajouter que la colonne « Total ». Par exemple, après la dernière rangée de 22 Marketer ligne, il devrait y avoir « Marketer Total », puis sous la colonne Total devrait être 1804. La même chose devrait se produire après la dernière rangée de Marketer 500.

Voir image au http://agricam.net/test.gif

requête en cours:

select Marketer, SubMarketer, année, total, Convert (varchar, date, 101) [date] de SomeTable où date> = '25.02.2009' et Date < '2/26/2009' and Marketer dans ('22', '500') Group par Sous-marque de distributeur, Grade, Marketeur, Date, au total ordre par Marketer

Merci.

+0

fournissent la structure des tables et La requête select –

Répondre

6

voir Using ROLLUP to aggregate data in SQL

mise en œuvre:

DECLARE @SOMETABLE TABLE (SUBMARKETER INT, GRADE CHAR, MARKETER INT, 
    DATE DATETIME, TOTAL INT) 
INSERT INTO @SOMETABLE 
SELECT 1415, 'A', 22, '02/25/2009', 26 UNION 
SELECT 1415, 'B', 22, '02/25/2009', 93 UNION 
SELECT 1415, 'C', 22, '02/25/2009', 1175 UNION 
SELECT 1415, 'D', 22, '02/25/2009', 510 UNION 
SELECT 1169, 'B', 500, '02/25/2009', 1 UNION 
SELECT 1169, 'C', 500, '02/25/2009', 3 UNION 
SELECT 1393, 'C', 500, '02/25/2009', 2 UNION 
SELECT 2, 'B', 500, '02/25/2009', 5 UNION 
SELECT 2, 'C', 500, '02/25/2009', 111 UNION 
SELECT 2, 'D', 500, '02/25/2009', 18 

SELECT 
    CASE WHEN SUBMARKETER IS NULL THEN 'Marketer Total' 
    ELSE CONVERT(VARCHAR, MARKETER) END MARKETER, 
    SUBMARKETER, GRADE, TOTAL, DATE 
    FROM (
    SELECT MARKETER, SUBMARKETER, GRADE, SUM(TOTAL) AS TOTAL, 
    CONVERT(VARCHAR,DATE,101)[DATE] 
    FROM @SOMETABLE 
    WHERE DATE >= '2/25/2009' AND DATE < '2/26/2009' 
    AND MARKETER IN ('22','500') 
    GROUP BY MARKETER, SUBMARKETER, GRADE, DATE WITH ROLLUP 
)M 
WHERE M.MARKETER IS NOT NULL 
AND NOT (SUBMARKETER IS NOT NULL AND DATE IS NULL) 

attention: cela fonctionnera bien si Marketer, SUBMARKETER et colonnes DATE sont NOT NULL. S'il y aura des valeurs NULL de ces champs dans la table, cela deviendra un problème pour filtrer les regroupements inutiles.

+0

ROLLUP() et PARTITION() en utilisant le numéro de Marketer devrait vous aider. C'est un complexe cependant. Bonne chance. – achinda99

+0

Je jouais avec cette idée, mais je ne peux pas l'obtenir pour faire la bonne chose. – egjoni

-1

Créez un déclencheur sur la table qui calcule le total lorsqu'un enregistrement est inséré. De cette façon, vous pouvez vérifier que vous avez le dernier total chaque fois qu'il y a un mouvement dans la base de données.

+0

S'il y a des millions et des millions de lignes, cela pourrait être une bonne stratégie d'utiliser des déclencheurs pour maintenir une table agrégée. Mais ça devrait être beaucoup. Vous devez également déclencher un recalcul des totaux sur les déclencheurs de mise à jour et de suppression. –

+0

Je pense que la meilleure façon serait de passer par Grouping/ROLLUP, c'est juste un moment difficile de le montrer exactement ce dont j'ai besoin. – egjoni

+0

Je n'ai aucun problème avec la sommation ou la dénormalisation. Soit peut être une méthode valide de résoudre le problème. Comme vous l'avez dit, cela dépend vraiment. –

0

La réponse de Coldice est la bonne. Sauf si vous avez une raison impérieuse de stocker des données agrégées dans la table, le moteur de recherche est suffisamment puissant pour faire cela pour vous. Pouvez-vous expliquer pourquoi vous avez besoin de cette rangée dans le tableau? Est-ce à des fins d'affichage? Vous pouvez utiliser la fonction ROLLUP pour mettre les résultats globaux dans une requête ou vous pouvez exécuter une requête séparée telle Semer les totaux:

SELECT marketer, SUM(total) FROM TablenameHere GROUP BY marketer 
+0

C'est un rapport ... donc les données doivent être affichées en détail – egjoni

+0

La plupart des moteurs de rapports supportent les totaux de groupe. Quel écrivain de rapport utilisez-vous? –

+0

J'écris simplement une requête en SQL. – egjoni

0

Je crois que vous pouvez également utiliser COMPUTE SUM

+0

J'ai essayé votre proposition, mais il semble que le total pour chaque marketer a été retourné dans un set de résultats séparé –

+0

Comme le lien le dit, 'COMPUTE' est obsolète - utilisez plutôt' ROLLUP'. –

Questions connexes