2010-04-29 5 views
2

Je suis relativement nouveau avec sql et j'ai besoin d'aide pour la construction de requêtes de base.SQL: Besoin d'aide pour la construction de requêtes

Problème: Pour récupérer le nombre d'ordres et l'ID du client à partir d'une table basée sur un ensemble de paramètres. Je veux écrire une requête pour comprendre le nombre de commandes sous chaque client (Colonne: Customerid) avec le CustomerID où le nombre de commandes doit être supérieur ou égal à 10 et le statut de la commande doit être Active . De plus, je souhaite également connaître la première date de transaction d'une commande appartenant à chaque client.

Tableau Description:

product_orders

Orderid CustomerId Transaction_date Status 
------- ---------- ---------------- ------- 
1  23   2-2-10   Active 
2  22   2-3-10   Active 
3  23   2-3-10   Deleted 
4  23   2-3-10   Active 

la requête que je l'ai écrit:

select count(*), customerid 
    from product_orders 
where status = 'Active' 
GROUP BY customerid 
ORDER BY customerid; 

La déclaration ci-dessus me donne

  • la somme de toute commande sous un client mais ne remplit pas la condition d'au moins 10 commandes.
  • Je DONOT savoir comment pour afficher la première date de la transaction ainsi que l'ordre dans une customerid (statut: pourrait être actif ou delelted n'a pas d'importance)

Des solutions idéales devraient ressembler à:

Total Orders CustomerID Transaction Date (the first transaction date) 
------------ ---------- ---------------- 
11   23   1-2-10 

Merci d'avance. J'espère que vous auriez la gentillesse de m'arrêter et de m'aider.

Cheers,

Leonidas

Répondre

1
SELECT 
    COUNT(*) AS [Total Orders], 
    CustomerID, 
    MIN(Transaction_date) AS [Transaction Date] 
FROM product_orders 
WHERE product_orders.Status = 'Active' 
GROUP BY 
    CustomerId 
HAVING COUNT(*) >= 10 
+0

merci Daniel :) – Geeknidas

1

HAVING vous permettra de filtrer les agrégats comme COUNT() & MIN() montrera la première date.

select 
    count(*), 
    customerid, 
    MIN(order_date) 
from product_orders 
    where status = 'Active' 
    GROUP BY customerid 
    HAVING COUNT(*) >= 10 
    ORDER BY customerid 

Si vous voulez la date la plus quel que soit le statut, vous pouvez sous-requête pour elle

select 
    count(*), 
    customerid, 
    (SELECT min(order_date) FROM product_orders WHERE product_orders.customerid = p.customerid) AS FirstDate 
from product_orders P 
    where status = 'Active' 
    GROUP BY customerid 
    HAVING COUNT(*) >= 10 
    ORDER BY customerid 
+0

Ne sont pas dans la liste des sous-requêtes des champs lents? J'ai vu une requête qui tourne environ 180 secondes sur Oracle à cause de ces sous-requêtes. Réécriture d'une requête de sorte que les mêmes données ('FirstDate' dans yo par exemple) soient récupérées de" pseudo-vue "(c.-à-d., sous-requête utilisée comme source de données; je ne sais pas comment ça s'appelle) qui est «joint» à d'autres sources de données temps réduit à 0,1, 0,2 secondes. – binaryLV

0

Cette requête devrait vous donner les ordres actifs totaux pour chaque client qui a 10 ou des commandes plus actifs. Il affichera également la première date de commande active.

Select Count(OrderId) as TotalOrders, 
     CustomerId, 
     Min(Transaction_Date) as FirstActiveOrder 

From Product_Orders 
Where [Status] = 'Active' 
Group By CustomerId 
Having Count(OrderId)>10 
0
select count(*), customerid, MIN(Transaction_date) from product_orders 
    where status = 'Active' 
    GROUP BY customerid having count(*) >= 10 
    ORDER BY customerid 
Questions connexes