0
votes

Rolling 12 mois de données - SQL

premier message alors s'il vous plaît soyez patient :) Je tiens à compter le nombre de clients qui ont passé une commande dans un mois spécifique et trouvent le nombre de commandes qu'ils ont placées dans ce mois et les 11 mois précédant ce mois-ci. Je ne suis vraiment pas sûr de savoir où commencer une aide afin que toute aide serait grandement appréciée, je me rendrais aussi assez vague, donc il peut y avoir quelques questions de suivi

​​J'ai actuellement une table de la clientèle, des ordonnances et la date de leur Commandez comme ci-dessous: p>

p>

Date      CustomerCount   12MonthOrderCount
Jan 2017  2               3
Dec 2016  1               1


4 commentaires

Veuillez poster des échantillons de données pour vos tables, expliquer comment les tables rejoignent (si ce n'est pas évident) ainsi que vos résultats souhaités de cette exemple de données. Vous pouvez consulter un site comme celui-ci pour l'aide pour le formatage des données d'une manière qui fonctionne bien ici sur tellement.


Vous devez également décider quel DBMS vous utilisez réellement. MySQL <> SQL Server et la réponse seront assez différentes pour chacune d'elles.


Qu'est-ce que tu as essayé jusque-là?


J'ai ajouté des données d'échantillonnage et le résultat souhaité des données de la table, merci pour votre patience!


6 Réponses :


0
votes

Si vous utilisez T-SQL, vous pouvez utiliser ci-dessous Query

select t1.CusttomerIdfrom table1 t1
outer apply
(
    select top 1 t2.CId, t2.OrderId from table2 t2 
    where t2.CID = t1.CustomerId and [Date] = specificDate 
)q


0 commentaires

0
votes

Comme il y a beaucoup d'inconnues dans votre question, j'ai pris la liberté de faire de nombreuses hypothèses. L'un d'eux est que vous utilisez MSSQL. Ce code pourrait vous indiquer une direction possible.

USE TEMPDB

DECLARE @Period INT
SET @Period = YEAR ( '20190101') * 100 + MONTH ('20190101') 

CREATE TABLE #T (CustID INT, OrderInPeriod INT, NumberOfOrders INT)

INSERT INTO #T 
SELECT CustID, 0, 0
FROM Customers

UPDATE #T
SET OrderInPeriod = 1 
FROM Orders AS O
WHERE #T.CustID = O.CustID
  AND YEAR (OrderDate) * 100 + MONTH (OrderDate) = @Period


UPDATE #T
SET NumberOfOrders = ( SELECT COUNT(*) AS Cnt FROM Orders AS O
                       WHERE #T.CustID = O.CustID
                         AND OrderDate > DATEADD (YEAR, -1, '20190101')


0 commentaires

0
votes

Je pense que vous voulez utiliser une fonction de fenêtre pour cette Voir ici

Si vous ne les avez pas vérifiées déjà, je le ferais.


0 commentaires

0
votes

Pour obtenir la table de base, utilisez l'agrégation:

select year(orderdate), month(orderdate), count(*) as num_orders,
       (select count(*)
        from orders o2
        where year(o2.orderdate) * 100 + month(o2.orderdate) > year(o.orderdate) * 100 + month(o.orderdate) - 12 and
              year(o2.orderdate) * 100 + month(o2.orderdate) <= year(o.orderdate) * 100 + month(o.orderdate)
       ) as num_12month_orders
from orders o
group by year(orderdate), month(orderdate);


0 commentaires

0
votes

Je suppose que vous voulez savoir combien de commandes dans le mois actuel.

  1. Sélectionnez comment activer le texte dans vos colonnes de commandeDate sur une date code> DataType. p> li>

  2. Utilisez la date appropriée Arithmétique dans l'endroit où les déclarations. P> Li> OL>

    1: Ce type d'expression vous obtient un Date code> Afficher le premier jour du mois à partir de mon yy code> Cet exemple retourne 2018-02 -01 code>. P>

       SELECT CustomerId, CustomerCount, 12MonthOrderCount
         FROM ( /* the query showing the full year data */ ) yr
         FROM ( /* the query showing the month data */ ) mon ON yr.CustomerId=mo.CustomerId
    


0 commentaires

0
votes

Vous pouvez utiliser le code suivant pour obtenir les résultats souhaités.

select count (distinct CustomerID) as 'CustomerCount', count (OrderID) as '12MonthOrderCount' 
from orders
where  (OrderDate <= '2017-01-01' AND OrderDate >= '2016-01-01')


0 commentaires