Y a-t-il un meilleur moyen d'ajouter les 3 dernières valeurs d'une rangée où la valeur n'est pas 0 (i.e, ignorer la colonne lorsque la valeur = 0)? Exemple: p> à la recherche de valeurs de ligne; 20, 15, 12, 20. P> En ce moment, je pense seulement à une déclaration de cas massive ... p> p>
4 Réponses :
Vous pouvez le faire en impouvert les colonnes les commander, puis en résumant comme ceci: Cependant, alors que d'autres signalent que nous voudrions faire cela, je soupçonne que votre modèle de données a des problèmes et vous «D Soyez meilleur avec ces valeurs dans les colonnes pour commencer. p> p>
Vous devez pivoter vos données et normaliser ça. Ensuite, vous pouvez facilement em> l'agrégez. C'est ainsi que vous le feriez "à la volée": p> idéalement, cependant, vous devez corriger votre modèle de données. P> P> déc code>.
Merci - Le modèle de données est intégré à Excel. Je pensais qu'une importation rapide et peu de requêtes SQL seraient plus rapides pour arriver à la réponse.
Vous pouvez convertir des colonnes en lignes en utilisant cross appliquer code> et agrégat:
Essayez ceci:
DECLARE @DataSource TABLE
(
[RowID] INT IDENTITY(1,1)
,[Jan] INT
,[Feb] INT
,[Mar] INT
,[Apr] INT
,[May] INT
);
INSERT INTO @DataSource ([Jan], [Feb], [Mar], [Apr], [May])
VALUES (2, 3, 10, 0, 7)
,(2, 3, 10, 0, 0)
,(2, 3, 0, 0, 7)
,(2, 3, 10, 0, 7);
WITH DataSource AS
(
SELECT [RowID]
,ROW_NUMBER() OVER (PARTITION BY [RowID] ORDER BY CASE [column]
WHEN 'Jan' THEN 1
WHEN 'Feb' THEN 2
WHEN 'Mar' THEN 3
WHEN 'Apr' THEN 4
WHEN 'May' THEN 5
END DESC
) AS [MonthID]
,[value]
FROM @DataSource
UNPIVOT
(
[value] FOR [column] IN ([Jan], [Feb], [Mar], [Apr], [May])
) UNPVT
WHERE [value] <> 0
)
SELECT [RowID]
,SUM([value])
FROM DataSource
WHERE [MonthID] <= 3
GROUP BY [RowID];
Somme Code> Ne fonctionnera de toute façon pas ici,Somme Code> fonctionne à travers les lignes et non des colonnes. Qu'est-ce qui détermine une colonne est la "dernière" colonne? Cela ressemble à une faille de conception si vous ajoutez une nouvelle colonne à chaque fois pour une "dernière" valeur.Y a-t-il au moins une colonne code> id code> ou quelque chose? Est-ce que celles-ci vont jusqu'à
déc code>? Raëlly, vous devriez aussi normaliser vos données.DERNIER COMME EN; [MAI] + [APR] + [MAR] Toutefois, si l'une de ces colonnes est 0, passez à autre chose pour trouver les 3 premières colonnes avec des valeurs positives. Il y a une pièce d'identité unique par ligne.