J'ai un ensemble de données sur les pièces, le prix par pièce et le mois. J'accède à ces données via une connexion en direct à une base de données SQL Server. Cette base de données est mise à jour mensuellement avec de nouveaux prix pour chaque pièce. Ce que je voudrais faire est de représenter graphiquement une année de données de prix pour les dix pièces dont les prix ont le plus changé au cours du dernier mois (soit en pourcentage du prix du mois dernier, soit en tant que variation totale en dollars).
Depuis ma base de données la connexion est en direct, idéalement, Tableau récupérerait les nouvelles données de prix chaque mois, mettant à jour les dix premières pièces dont les prix ont changé pour la nouvelle période. Je ne veux pas avoir à modifier manuellement les mois ou utiliser une procédure stockée si possible.
part price date 110 167.66 2018-12-01 00:00:00.000 113 157.82 2018-12-01 00:00:00.000 121 99.16 2018-12-01 00:00:00.000 133 109.82 2018-12-01 00:00:00.000 137 178.66 2018-12-01 00:00:00.000 138 154.99 2018-12-01 00:00:00.000 143 67.32 2018-12-01 00:00:00.000 149 103.82 2018-12-01 00:00:00.000 113 167.34 2018-11-01 00:00:00.000 121 88.37 2018-11-01 00:00:00.000 133 264.02 2018-11-01 00:00:00.000
4 Réponses :
Vous n'avez fourni aucun exemple de données, mais vous pouvez suivre quelque chose comme ceci,
;WITH top_parts AS ( -- select the top 10 parts based on some criteria SELECT TOP 10 parts.[id], parts.[name] FROM parts ORDER BY <most changed> ) SELECT price.[date], p.[name], price.[price] FROM top_parts p INNER JOIN part_price price ON p.[id] = price.[part_id] ORDER BY price.[date]
Ce sera quelque chose comme ça pendant un mois seulement. Si vous avez besoin de toute l'année, vous devez spécifier clairement ce que vous voulez voir exactement:
;WITH cte as ( SELECT TOP 10 m0.Part , Diff = ABS(m0.Price - m1.Price) , DiffPrc = ABS(m0.Price - m1.Price) / m1.Price FROM Parts as m0 INNER JOIN (SELECT MaxDate = MAX([Date] FROM Parts) as md ON md.MaxDate = m0.[Date] INNER JOIN Parts as m1 ON m0.Part = m1.Part and DATEADD(MONTH,-1,md.MaxDate) = m1.[Date] ORDER BY ABS(m0.Price - m1.Price) DESC -- Top 10 by percentage: -- ORDER BY ABS(m0.Price - m1.Price) / m1.Price DESC ) SELECT * FROM Parts as p INNER JOIN cte ON cte.Part = p.Part
if DateDiff (‘month’, [date], Today ()) <= 1 then [price] end
. Cela renvoie le prix des enregistrements récents et null pour les enregistrements plus anciens. Vous devrez peut-être modifier la condition en fonction des détails ou utiliser un calcul LOD pour toujours obtenir les deux dernières valeurs quelle que soit la date d'aujourd'hui. Max ([Recent_Price]) - Min ([Recent_Price])
Notez que vous ne pouvez pas dire à partir de cela si le changement était positif ou négatif, juste son ampleur. Il n'est pas difficile d'étendre cela pour inclure le signe dans la modification de prix ou pour le convertir en pourcentage. Astuce, vous aurez probablement besoin d'une paire de calculs comme celui-ci à l'étape 1 pour sélectionner les prix pour des mois spécifiques
Select TOP (@TopN) parts,ChangePrice ( select parts,ABS(max(price)-min(price)) as ChangePrice from dbo.Table1 where dates>=@From and dates<=@InputLastMonth group by parts )t4 order by ChangePrice desc
Question très intéressante sur la façon de déterminer le TOP 10 par prix et pourcentage. Je dirais que vous avez 20 articles. Le prix de 10 d'entre eux a augmenté de 100 $ à 110 $ (10%) et 10 autres articles ont augmenté de 1 $ à 2 $ (100%) - Quels articles montriez-vous?
@ slava-murygin Je suis curieux de savoir comment montrer les deux parce que je ne suis pas sûr de ce qui sera le plus bénéfique à long terme.
ahh nombres réels Pouvez-vous fournir une définition de table? Voulez-vous seulement le mois dernier?
Désolé ajouté un échantillon ci-dessus.