2009-08-10 5 views
1

J'essaye de créer une requête pour additionner le total des cadeaux donnés par une certaine personne, mais pour ajouter un drapeau sur le cadeau individuel quand le don total atteint 500 $ (je n'ai pas besoin de somme après cela). J'ai l'ID de personne, la taille du cadeau et la date du cadeau. par exemple:SQL Running Sum avec des drapeaux à certains montants

ID   gift_date  gift_amt 
--------- -----------  -------------- 
1   1/6/09   500 
2   1/9/09   200 
2   1/15/09   65 
3   1/26/09   140 
2   2/10/09   600 
3   3/7/09   200 

Je voudrais un drapeau à afficher dans ma requête pour ID # 1 sur la ligne avec gift_date de 06/01/09, pour ID # 2 pour la date de cadeau 10/02/09 et pas de drapeau pour l'ID # 3.

Répondre

1

En Oracle et PostgreSQL 8.4:

SELECT q.*, CASE WHEN psum > 500 THEN 1 ELSE 0 END AS flag 
FROM (
     SELECT gd.*, SUM(gift_amt) OVER (PARTITION BY id ORDER BY gift_date) AS psum 
     FROM gift_date gd 
     ) q 
WHERE psum <= 500 - gift_amt 
+0

semble fonctionner bien. Merci. – Jim

1

Typiquement, cela serait fait par la vue (comme dans Model-View-Controller). Le plus souvent, il s'agit d'un contrôle de grille qui a des fonctionnalités de regroupement, plutôt que lorsque les données sont chargées. Vous devez ensuite charger les données de la base de données comme indiqué ci-dessus et configurer la vue pour afficher les données regroupées.

+0

Mon plan est de mettre ceci dans une vue une fois que je l'ai joint avec l'information que je cherche. – Jim

+0

Désolé, je ne voulais pas dire vue comme dans une vue de base de données, je voulais dire vue comme dans le modèle-vue-contrôleur. –

0

Pour la version SQL Server 2005+, utilisez ci-dessous requête si vous avez besoin que la colonne de drapeau

 
--suppose this is your table 
DECLARE @Table TABLE 
(
    ID int,gift_date datetime,gift_amt int 
) 
INSERT INTO @Table 
SELECT 1,'1/6/09',500 UNION ALL 
SELECT 2,'1/9/09',200 UNION ALL 
SELECT 2,'1/15/09',65 UNION ALL 
SELECT 3,'1/26/09',140 UNION ALL 
SELECT 2,'2/10/09',600 UNION ALL 
SELECT 3,'3/7/09',200 

;WITH CTE As 
(
    SELECT ID,gift_date,gift_amt, 
    SUM(gift_amt)OVER(PARTITION BY ID) As TotalSum 
    FROM @Table 
) 
SELECT ID,gift_date,gift_amt, 
CASE WHEN TotalSum>500 then 1 else 0 end as Flag 
FROM CTE