2012-06-06 1 views
2

J'ai vue avec des champs:fonction SQL Server SUM en vue

typeId, type int 
price, type decimal(15,4)) 

Le prix est la valeur calculée.

Ce que je voudrais est d'ajouter une autre colonne calculée (totalPrice) dans l'instruction select qui résumerait tous les prix pour les dossiers avec la même id me donnant le résultat (en supposant qu'il ya quatre lignes de la vue):

typeId price   totalPrice 
1  10,000  30,000 
1  15,000  30,000 
1  5,000   30,000 
2  10,000  10,000 

Merci.

Répondre

3

En supposant que votre vue existante est nommé TheSummary. Renommez-le en x_TheSummary

Créez une nouvelle vue qui porte l'ancien nom de la vue renommée.

create view TheSummary as 

select x.*, g.totalPrice 
from x_TheSummary x 
join 
(
    select typeId, sum(price) as totalPrice 
    from x_TheSummary 
    group by typeId 
) as g on g.typeId = x.typeId 

De cette façon, votre nouvelle vue pas de changements de rupture à des applications qui dépend ancien nom de vue

Par ailleurs, puisque vous utilisez SQL Server 2008, vous pouvez utiliser le fenêtrage suivant -query aussi, la requête ci-dessus fonctionne sur les SGBDR non-fenêtrables.

create view TheSummary as 

select x.*, sum(totalPrice partition by typeId) as totalPrice 
from x_TheSummary x 

Il est beaucoup plus simple


@ ivan-83 Pour une seconde, je pensais que SQL Server 2008 ne prend pas en charge fenêtrage sur la partition. Je pense trop de cette construction (total en cours d'exécution) qui ne fonctionne pas sur SQL 2008, mais il fonctionne sur SQL 2012.

SELECT i, sum(i) over(order by i) as rt 
FROM (values(1),(9),(7),(6)) as x(i) 

La requête en cours d'exécution totale ne fonctionne pas sur SQL 2008: http://www.sqlfiddle.com/#!3/d41d8/1539

Et cela fonctionne maintenant sur SQL 2012: http://www.sqlfiddle.com/#!6/d41d8/111

Sorties:

| I | RT | 
---------- 
| 1 | 1 | 
| 6 | 7 | 
| 7 | 14 | 
| 9 | 23 | 

Pour résumer, SQL Server 2012 prend en charge non seulement fenêtrage sur la partition, un LSO prend en charge le fenêtrage ligne par ligne. SQL Server 2008 prend en charge la fenêtre sur la partition uniquement. Les solutions @ ivan-83 fonctionnent donc aussi. Pour cela, j'attaque votre réponse

+0

Cela a fonctionné comme un charme. Ravi d'apprendre quelque chose de nouveau. Je vous remercie. – no9

1
select *, (select sum(price) 
      from view as v2 
      where v2.typeId = v1.typeId) as totalPrice 
from view as v1 

Essayez cette

. 
    . 
    . 

dbo.SklepOcenjenaVrednost.StevilkaNarocila, 
    CAST(CASE dbo.CstPostavkaSklepa.DDVID WHEN 1 
     THEN dbo.CstPostavkaSklepa.CenaSkupajDDV * 1.085 
     WHEN 2 THEN dbo.CstPostavkaSklepa.CenaSkupajDDV * 1.2 
     ELSE dbo.CstPostavkaSklepa.CenaSkupajDDV END AS decimal(15, 4)) AS CenaPostavkeZDDV 

    , (select sum (CAST(CASE dbo.CstPostavkaSklepa.DDVID 
        WHEN 1 THEN dbo.CstPostavkaSklepa.CenaSkupajDDV * 1.085 
        WHEN 2 THEN dbo.CstPostavkaSklepa.CenaSkupajDDV * 1.2 
        ELSE dbo.CstPostavkaSklepa.CenaSkupajDDV END AS decimal(15, 4))) 
    from dbo.CstPostavkaSklepa as CstPostavkaSklepa2 
    where dbo.CstPostavkaSklepa.SklepID = CstPostavkaSklepa2.SklepID) as CenaSklepaZDDV 

FROM dbo.CstSklep INNER JOIN 
    dbo.ActiveProcess ON dbo.CstSklep.ProcID = dbo.ActiveProcess.Id INNER JOIN 
    dbo.CstPostavkaSklepa ON dbo.CstSklep.SklepID = dbo.CstPostavkaSklepa.SklepID INNER JOIN 
    . 
    . 
    . 
+0

Je veux ajouter cette colonne à une vue existante (dans la conception) – no9

+0

@ no9 pouvez-vous afficher la requête? –

+0

J'ai modifié la question. – no9