2013-04-13 5 views
0

J'essaie de sélectionner le MAX (QTYSOLDTHISDAY) par ID à partir d'une feuille Excel. mais le code ci-dessous continue à sélectionner plusieurs enregistrements avec une valeur MAX. tout ce dont j'ai besoin est un enregistrement à sélectionner. J'ai essayé le groupe par ID, ça n'a pas fonctionné. voici mon code. grâceGroupe MAX par ID

Dept(0) = "01" 
    Dept(1) = "02" 
    Dept(2) = "03" 
    Dept(3) = "04" 
    Dept(4) = "05" 
Dim DeptNum As String 
Using cn As New OleDbConnection With {.ConnectionString = String.Format(ConnectionNoHeader6, FileName6)} 
     Dim dt7 As New DataTable 
     cn.Open() 
     For Each DeptNum In Dept 
      Dim cmd1 As OleDbCommand = New OleDbCommand(
       <Text> 
       SELECT 
        ID, 
         ARTNAME, 
          NETAMOUNTTHISDAY, 
          QTYSOLDTHISDAY, 
          AVAILABLESTOCK 


       FROM [<%= SheetName6 %>$] 
WHERE ID = <%= DeptNum %> and QTYSOLDTHISDAY=(select max(QTYSOLDTHISDAY) from [<%= SheetName6 %>$] where ID = <%= DeptNum %> group by ID) 
</Text>.Value, 
        cn 
      ) 
      dt7.Load(cmd1.ExecuteReader) 
      For Each row As DataRow In dt7.Rows 
      Next 
      DataGridView2.DataSource = dt7 
     Next DeptNum 
    End Using 
+2

Si votre question est sur le SQL, pourquoi tout le code VB.NET inclus? Publiez simplement un petit échantillon de vos données, les résultats que vous souhaitez obtenir à partir de ces données et le code SQL que vous avez écrit ne fonctionne pas comme prévu. Tout l'autre code (qui n'est pas réellement lié à votre question) est juste encombrant qui rend votre question plus difficile à lire. –

+0

Eh bien le problème que j'ai est avec la déclaration Select.Je suis capable de tirer tous les records avec le MAX mais je n'en ai besoin que d'un. Et la raison pour laquelle j'ai mis tout le code parce que j'ai fait beaucoup de recherches auparavant et aucune n'était liée à ce que je suis en train de faire. J'ai essayé de poster juste une image de la feuille Excel mais le téléchargeur ne reconnaîtra pas mon fichier PNG! – user1858480

+1

Je n'ai pas dit une * photo *. Un tableau de texte simple fonctionnera avec des lignes et des colonnes de données d'exemple et un tableau de texte des résultats que vous souhaitez obtenir. Le problème que vous décrivez est avec 'SELECT', qui est strictement SQL. Cela n'a absolument rien à voir avec tout le code VB que vous avez posté avec. Comme je l'ai dit, c'est l'encombrement qui rend plus difficile la lecture de votre question. –

Répondre

0

Depuis Excel est un produit Microsoft, je suppose que Select top est un statment valide. Essayez d'ajouter un Top 1 à votre requête.

SELECT TOP 1 
     ID, 
     ARTNAME, 
     NETAMOUNTTHISDAY, 
     QTYSOLDTHISDAY, 
     AVAILABLESTOCK 

FROM [<%= SheetName6 %>$] 
WHERE ID = <%= DeptNum %> 
     and QTYSOLDTHISDAY=(select max(QTYSOLDTHISDAY) 
          from [<%= SheetName6 %>$] 
          where ID = <%= DeptNum %> 
          group by ID) 

S'il y a plusieurs enregistrements qui ont le même QTYSOLDTHISDAY, comment décidez-vous que l'on pour revenir? Si vous devez prendre une décision comme celle-là, utilisez un Order By sur la requête externe pour obtenir l'enregistrement dont vous avez besoin retourné à la première place dans les résultats.

0

Je viens de passer une demi-heure la recherche d'une référence de langue pour SQL sur Excel sans succès - à vérifier vous pouvez utiliser TOP n comme avec SQL Server. Puisque d'autres supposent que cela fonctionne, je vais supposer.

En utilisant TOP 1 vous pouvez simplifier généralement votre déclaration:

SELECT TOP 1 
     ID, ARTNAME, NETAMOUNTTHISDAY, QTYSOLDTHISDAY, AVAILABLESTOCK 
FROM [<%= SheetName6 %>$] 
WHERE ID = <%= DeptNum %> 
ORDER BY QTYSOLDTHISDAY DESC 

Il n'y a pas de point dans une sous-requête séparée pour trouver la QTYSOLDTHISDAY maximale. Commandez-le par ordre décroissant et choisissez la première rangée. Cela vous donne un choix arbitraire de lignes partageant le maximum QTYSOLDTHISDAY.

Vous pouvez ajouter plusieurs colonnes à ORDER BY pour ajouter un ou plusieurs tie-breakers. Pour instqance, si vous avez plusieurs lignes partageant le QTYSOLDTHISDAY maximum et que vous voulez le plus petit parmi ceux ID:

ORDER BY QTYSOLDTHISDAY DESC, ID 
+0

Top 1 certainement fait, Merci les gars pour votre temps. – user1858480