2010-03-26 6 views
2

J'ai besoin de faire ce que je suis un type avancé. Je ces deux tableaux:Une commande compliquée par clause?

 
Table: Fruit 

fruitid | received | basketid 
    1  20100310 2 
    2  20091205 3 
    3  20100220 1 
    4  20091129 2 

Table: Basket 
id | name 
1 Big Discounts 
2 Premium Fruit 
3 Standard Produce 

Je ne suis même pas sûr que je peux simplement dire que je veux trier (ce qui est probablement une grande partie de la raison pour laquelle je ne peux pas sembler écrire du code pour le faire, lol).

Je fais une requête de jointure et j'ai besoin de trier tout ce qui est organisé par basketid. Le panier qui a la plus vieille date de fruit vient en premier, puis les autres rangs avec le même panier par date asc, puis le panier avec le premier fruit suivant. Date reçue suivie des autres rangées avec le même panier, et ainsi de suite.

Ainsi, la sortie devrait ressembler à ceci:

 
Fruitid | Received | Basket 
    4  20091129  Premuim Fruit 
    1  20100310  Premuim Fruit 
    2  20091205  Standard Produce 
    3  20100220  Big Discounts 

Toute idée comment accomplir cela en une seule exécution?

Répondre

2

essayer (code de configuration de table serveur SQL, mais requête doit travailler dans une base de données)

DECLARE @Fruit table (fruitid int, received int, basketid int) 
INSERT @Fruit VALUES(1,  20100310, 2) 
INSERT @Fruit VALUES(2,  20091205, 3) 
INSERT @Fruit VALUES(3,  20100220, 1) 
INSERT @Fruit VALUES(4,  20091129, 2) 

DECLARE @Basket table (id int,basket varchar(20)) 
INSERT @Basket VALUES (1, 'Big Discounts' ) 
INSERT @Basket VALUES (2, 'Premium Fruit' ) 
INSERT @Basket VALUES (3, 'Standard Produce') 


SELECT 
    f.Fruitid ,f.received,b.basket 
    FROM @Fruit f 
     INNER JOIN (SELECT 
         basketid, MIN(received) AS received 
         FROM @Fruit 
         GROUP BY basketid 
       ) o ON f.basketid = o.basketid 
     INNER JOIN @Basket b ON o.basketid=b.id 
    ORDER BY o.received 

SORTIE

Fruitid  received basket 
----------- ----------- -------------------- 
4   20091129 Premium Fruit 
1   20100310 Premium Fruit 
2   20091205 Standard Produce 
3   20100220 Big Discounts 

(4 row(s) affected) 
+0

Pensez que vous devriez changer la commande par être ORDER BY o.received, f.reçu – sgmoore

+0

@sgmoore, ouais, j'ai remarqué que, après @Quassnoi l'a ajouté à sa requête –

2
SELECT f.fruitid, f.received, ba.name AS basket 
FROM Fruit f 
JOIN (
     SELECT basketid, MIN(received) AS mr 
     FROM fruit 
     GROUP BY 
       basketid 
     ) b 
ON  f.basketid = b.basketid 
JOIN basket ba 
ON  ba.id = f.basketid 
ORDER BY 
     b.mr, f.basketid, f.received 
+0

cela ne donne pas les colonnes que l'OP veut –

+0

@ KM: c'est le cas maintenant, et pas à cause de mon montage. –

+0

il n'y a pas de 'f.mr 'à commander par doit être b.mr; 'FROM Friut' devrait produire des fruits; 'ON f.backetid' devrait être f.basketid; ', ba.name' devrait être ba.basket –

Questions connexes