2010-09-15 5 views
3

Je suis sûr que c'est une question stupide n00b, mais j'ai la table de résultats suivante (qui est créée à travers une longue question que je ne comprends qu'à moitié) et ce que je voudrais est de pouvoir ajouter deux colonnes qui fonctionnent le pourcentage de la ligne par rapport au total:Ligne de pourcentage du total où chaque ligne détermine par groupe par clause

tableau des résultats Exemple:

CREATE TABLE #temp 
(category varchar(30) 
,count_people INT 
,numpayments05 INT 
,avegifts05 DECIMAL(4,2) 
,value05 DECIMAL(18,2) 
,donorvalue05 DECIMAL(18,2) 
,giftvalue05 DECIMAL(18,2) 
) 
INSERT INTO #temp VALUES ('Single Gifts',124945,182458.00,1.46,28787034.10,230.40,157.77) 
INSERT INTO #temp VALUES ('New Donor',67598,78799.00,1.17,5915450.93,87.51,75.07) 
INSERT INTO #temp VALUES ('Reactivated',19853,27394.00,1.38,4348419.38,219.03,158.74) 
INSERT INTO #temp VALUES ('2yrs consecutive',20604,31633.00,1.54,3556766.75,172.63,112.44) 
INSERT INTO #temp VALUES ('3/4yrs consecutive',7536,13251.00,1.76,1827917.34,242.56,137.95) 
INSERT INTO #temp VALUES ('5+yrs consecutive',9354,31381.00,3.35,13138479.70,1404.58,418.68) 

la rangée du haut, « cadeaux simples » est le résultat d'une clause rollup sur la requête principale (pas sûr si cela affecte le calcul du pourcentage (ce qui signifie que la catégorie des cadeaux uniques est essentiellement une valeur totale par colonne), et chaque L'option tegory dérive d'une clause group by appliquée à la requête. Ce que je veux, c'est pouvoir ajouter deux nouvelles colonnes, 'pourcentage de la valeur' ​​et 'pourcentage de gens_de_compte', où pourcentage de valeur = valeur de ligne05/valeur totale05 (qui est la valeur05 pour le catégorie des cadeaux). Le pourcentage de count_people serait la valeur de ligne pour count_people, encore une fois divisé par le total (qui est ce qui est contenu dans le « cadeaux catégorie unique rangée »

Je suis sur SQL Server 2005 dans le cas qui aide.

Merci!

Répondre

2

Cette requête vous donnera vos pourcentages par rangée:

SELECT category, count_people, numpayments05, avegifts05, value05, donorvalue05, giftvalue05, 
    value05/SUM(CASE category WHEN 'Single Gifts' THEN value05 ELSE 0.0 END) 
     OVER (PARTITION BY 1) AS [percentage of value], 
    count_people/SUM(CASE category WHEN 'Single Gifts' THEN count_people ELSE 0.0 END) 
     OVER (PARTITION BY 1) AS [percentage of count_people] 
FROM #temp ; 


En supposant que vous créez deux nouvelles colonnes #temp ce qui suit:

CREATE TABLE #temp 
(category varchar(30) 
,count_people INT 
,numpayments05 INT 
,avegifts05 DECIMAL(4,2) 
,value05 DECIMAL(18,2) 
,donorvalue05 DECIMAL(18,2) 
,giftvalue05 DECIMAL(18,2) 
,[percentage of value] decimal(5,2) 
,[percentage of count_people] decimal(5,2) 
) 
INSERT INTO #temp VALUES ('Single Gifts',124945,182458.00,1.46,28787034.10,230.40,157.77, null, null) 
INSERT INTO #temp VALUES ('New Donor',67598,78799.00,1.17,5915450.93,87.51,75.07, null, null) 
INSERT INTO #temp VALUES ('Reactivated',19853,27394.00,1.38,4348419.38,219.03,158.74, null, null) 
INSERT INTO #temp VALUES ('2yrs consecutive',20604,31633.00,1.54,3556766.75,172.63,112.44, null, null) 
INSERT INTO #temp VALUES ('3/4yrs consecutive',7536,13251.00,1.76,1827917.34,242.56,137.95, null, null) 
INSERT INTO #temp VALUES ('5+yrs consecutive',9354,31381.00,3.35,13138479.70,1404.58,418.68, null, null) 


Vous pouvez exécuter la mise à jour suivante pour enregistrer les pourcentages par ligne:

WITH cte AS 
    (SELECT category, 
    value05/SUM(CASE category WHEN 'Single Gifts' THEN value05 ELSE 0.0 END) 
     OVER (PARTITION BY 1) AS [percentage of value], 
    count_people/SUM(CASE category WHEN 'Single Gifts' THEN count_people ELSE 0.0 END) 
     OVER (PARTITION BY 1) AS [percentage of count_people] 
    FROM #temp 
    ) 

UPDATE #temp 
SET [percentage of value] = cte.[percentage of value], 
    [percentage of count_people] = cte.[percentage of count_people] 
FROM #temp 
JOIN cte ON #temp.category = cte.category 
+0

Merci pour cela - je n'aurais pas pensé mettre la catégorie dans une partition par 1 groupe – Dibstar

1

est-ce dans une deuxième requête en utilisant la première en entrée. ne pas essayer de modifier la première requête pour ajouter ces calculs, il est assez complexe car il est.

Questions connexes