2009-11-29 7 views
0

Dans SQL Server 2000:requête SQL obtenir des données

bonjour j'ai une table avec la structure suivante:

sku  brand  product_name  inventory_count 
------ ------ -------------  --------------- 
c001  honda  honda car 1   3 
t002  honda  honda truck 1  6 
c003  ford  ford car 1   7 
t004  ford  ford truck 1  8 
b005  honda  honda bike 5  9 
b006  ford  ford bike 6  18 

J'utilise la requête SQL suivante

select distinct left(sku,1) from products 

cela retournez ce qui suit:

c 
t 
b 

puis ...

c = car 
t = truck 
b = bike 

Cela fonctionne très bien,

Maintenant, je veux obtenir un exemple de produit pour chacune des catégories avec le plus grand INVENTORY_COUNT

afin qu'il renvoie les données :

c, "ford car 1" 
t, "ford truck 1" 
b, "ford bike 6" 

quelle requête SQL exécuterais-je pour obtenir ces données ??

je veux l'élément avec la plus grande INVENTORY_COUNT pour chaque catégorie .. gauche (sku, 1)

merci !!

+0

Quel DB utilisez-vous? –

+0

'gauche (sku, 1)' ressemble à MySQL – Andomar

+1

Pourrait également être T-SQL: http://doc.ddart.net/mssql/sql70/left.htm –

Répondre

0

Pour mysql:

SELECT LEFT(sku,1), product_name FROM Table1 GROUP BY LEFT(sku,1) 

Pour MS SQL 2005 (fonctionne peut-être en 2000?):

SELECT LEFT(sku,1), MAX(product_name) FROM Table1 GROUP BY LEFT(sku,1) 
+0

cela ne pas obtenir un seul enregistrement par catégorie, c, b, t – duro

+0

Désolé, j'ai oublié la gauche –

+0

duro: vous avez dit que vous utilisez MS SQL - c'est pour M ** y ** SQL: avis le "y". –

1

Vous pouvez joindre la table sur elle-même pour filtrer les lignes avec moins que le maximum inventaire:

select  left(a.sku,1), max(a.product_name), max(a.inventory_count) 
from   YourTable a 
left join YourTable more_inv 
on   left(a.sku,1) = left(more_inv.sku,1) 
and   a.inventory_count < more_inv.inventory_count 
where  more_inv.sku is null 
group by  left(a.sku,1) 

la condition WHERE sur more_inv.sku is null filtre les lignes qui n'ont pas le h le plus grand inventaire pour leur catégorie d'une lettre.

Une fois que nous sommes à des lignes avec l'inventaire maximum, vous pouvez utiliser max() pour obtenir le inventory_count (ce sera la même pour toutes les lignes) et un autre max() pour obtenir un des produits avec la plus inventory_count. Vous pouvez aussi utiliser min().

0

Utilisation de SQL Server 2005, vous pouvez essayer cette

DECLARe @Table TABLE(
    sku VARCHAR(50), 
    brand VARCHAR(50), 
    product_name VARCHAR(50), 
    inventory_count INT 
) 

INSERT INTO @Table SELECT 'c001', 'honda', 'honda car 1', 3 

INSERT INTO @Table SELECT 't002', 'honda', 'honda truck 1', 6 

INSERT INTO @Table SELECT 'c003', 'ford', 'ford car 1', 7 

INSERT INTO @Table SELECT 't004', 'ford', 'ford truck 1', 8 

INSERT INTO @Table SELECT 'b005', 'honda', 'honda bike 5', 9 

INSERT INTO @Table SELECT 'b006', 'ford', 'ford bike 6', 18 


SELECT LEFT(sku,1), 
     product_name 
FROM (
      SELECT *, 
        ROW_NUMBER() OVER(PARTITION BY LEFT(sku,1) ORDER BY inventory_count DESC) ORDERCOUNT 
      FROm @Table 
     ) SUB 
WHERE ORDERCOUNT = 1 

OK, vous pouvez essayer

SELECT LEFT(sku,1), 
      * 
    FROm @Table t INNER JOIN 
      (
       SELECT LEFT(sku,1) c, 
         MAX(inventory_count) MaxNum 
       FROM @Table 
       GROUP BY LEFT(sku,1) 
      ) sub ON LEFT(t.sku,1) = sub.c and t.inventory_count = sub.MaxNum 
+0

sa une ancienne version de SQL Server, avant SQL Server 2005 – duro

+0

Voir la réponse éditée –

1

im en utilisant la requête SQL suivante qui fonctionne,

SELECT gauche DISTINCT (field1, 1) en tant que chat, MAX (sku) comme toproduit FROM produits où inventaire_count> 0 GROUP BY par gauche (sku, 1)

j'ai juste besoin d'ajouter ..commande par inventory_count

0

Essayez cette

declare @t table (sku varchar(50),brand varchar(50),product_name varchar(50),inventory_count int) 
insert into @t 

    select 'c001','honda','honda car 1',3 union all 
    select 't002','honda','honda truck 1',6 union all 
    select 'c004','ford','ford car 1',7 union all 
    select 't004','ford','ford truck 1',8 union all 
    select 'b005','honda','honda bike 5',9 union all 
    select 'b006','ford','ford bike 6',18 

Requête:

select 

x.s + space(2) + ',' + space(2) + '"' + t.product_name + '"' as [Output] 

from @t t 
inner join 
(
    SELECT left(sku,1) as s,MAX(inventory_count) ic from @t 
    group by left(sku,1) 
) x 
on x.ic = t.inventory_count 
--order by t.inventory_count desc 

Sortie

c , "ford car 1" 
t , "ford truck 1" 
b , "ford bike 6" 
+0

cela retourne chaque ligne j'ai juste besoin d'un – duro

+0

Allez ..il renvoie uniquement les lignes ayant le nombre d'inventaire le plus élevé pour ce groupe. Vérifiez la sortie que vous avez spécifiée. –

0

En général, peut-il pas y avoir plus d'un élément avec max (inventeur y_count)?

Pour obtenir l'inventaire maximum par cateogry, utilisez un sous-requête, (syntaxe dépendra de votre base de données):

SELECT LEFT(sku,1) as category, MAX(inventory_count) as c 
FROM Table1 
GROUP BY LEFT(sku,1) 
SORT BY LEFT(sku,1) 

Cela vous donnera une table de max_inventory par catégorie, ainsi:

b,18 
c,7 
t,8 

Alors maintenant vous connaissez le maximum par catégorie. Pour obtenir des produits correspondants, utilisez ce résultat comme un sous-requête et trouver tous les produits dans le cateogry donné qui correspondent à la donnée max (inventory_count):

SELECT t1.* 
FROM Table1 AS t1, 
(SELECT LEFT(sku,1) AS category, MAX(inventory_count) AS c 
FROM Table1 
GROUP BY LEFT(sku,1) 
) AS t2 
WHERE LEFT(t1.sku,1) = t2.category AND t2.c = t1.inventory_count 

Désolé, le code ci-dessus peut/peuvent ne pas fonctionner dans votre base de données, mais j'espère que vous aurez l'idée.

Bill

PS - probablement pas utile, mais la conception de la table ne sont pas vraiment vous aider ici. Si vous avez le contrôle sur le schéma, aider à séparer cela en plusieurs tables.

Questions connexes