Avatar billede Sinox Nybegynder
22. januar 2015 - 12:29 Der er 6 kommentarer

Count ([Item No_]) = 1

Hej,
jeg har en tabel som ser sådan her ud

Posting Date|Item No_|Entry Type|
2015-01-13|1234|1
2015-01-13|1234|1
2015-01-12|1234|1
2015-01-12|5678|1
2015-02-12|4567|1

jeg ønsker en SQL sætning som kun retunerer de Item No_ records som findes én gang.

Altså, står et Item No_ listet 2 eller mere gange, skal de ignoreres. Men er Item No_ kun i tabellen en gang, så skal det med ud.

jeg har forsøgt med denne sætning, men det virker ikke rigtig. Hvad mon jeg gør galt?

SELECT [Item No_], [Posting Date], COUNT([Item No_]) AS Antal
FROM        myTable
GROUP BY [Entry Type], [Posting Date], [Item No_]
HAVING      ([Entry Type] = 1) AND (COUNT([Item No_]) = 1)
ORDER BY [Posting Date] DESC
Avatar billede Slettet bruger
22. januar 2015 - 12:35 #1
HAVING COUNT(*) = 1
og flyt [Entry Type] = 1 til WHERE

SELECT [Item No_], [Posting Date], COUNT([Item No_]) AS Antal
FROM        myTable
WHERE [Entry Type] = 1
GROUP BY [Entry Type], [Posting Date], [Item No_]
HAVING  COUNT(*)= 1
ORDER BY [Posting Date] DESC
Avatar billede Slettet bruger
22. januar 2015 - 12:37 #2
GROUP BY skal også ændres ellers får du én pr. dato:

SELECT [Item No_], max([Posting Date]), COUNT([Item No_]) AS Antal
FROM  myTable
WHERE [Entry Type] = 1
GROUP BY [Item No_]
HAVING  COUNT(*)= 1
ORDER BY [Posting Date] DESC
Avatar billede Sinox Nybegynder
22. januar 2015 - 12:42 #3
Så får jeg fejlen Microsoft OLE DB Provider for SQL Server error '80040e14'

Column "myTable.Posting Date" is invalid in the ORDER BY clause because it is not contained in either an aggregate function or the GROUP BY clause.
Avatar billede Slettet bruger
22. januar 2015 - 12:56 #4
Du kan skriv ORDER BY 2 eller ORDER BY max([Posting Date])
Avatar billede kjulius Novice
26. januar 2015 - 17:28 #5
Hvis du vil have fat i alle de detail-linjer der har et bestemt antal linjer, kan du lave en join til din grupperede tabel

SELECT t1.*
FROM myTable t1
INNER JOIN (
    SELECT [Entry Type],[Item No_], [Posting Date]
    FROM        myTable
    GROUP BY [Entry Type], [Posting Date], [Item No_]
    HAVING  (COUNT([Item No_]) = 1) AS t2
  ON t1.[Entry Type]=t2.[Entry Type]
  AND t1.[Item No_]=t2.[Item No_]
  AND t1.[Posting Date]=t2.[Posting Date] 

Det vil åbne for at vælge andre kriterier end 1.

Hvis du er tilfreds med kun at fange dem med 1 række, er det kun små ting du bør ændre i din oprindelige forespørgsel:

SELECT [Item No_], [Posting Date], COUNT([Item No_]) AS Antal
FROM        myTable
WHERE ([Entry Type] = 1)
GROUP BY [Posting Date], [Item No_]
HAVING  (COUNT([Item No_]) = 1)
ORDER BY [Posting Date] DESC

dvs. GROUP BY kan kun indeholde de felter der også er i SELECT sætningen (ekskl. COUNT, der jo er en grupperingsfunktion) og kriteriet på [Entry Type] må tilsvarende flyttes fra HAVING til WHERE (da det ikke indgår i SELECT felterne).
Avatar billede kjulius Novice
23. juni 2015 - 19:22 #6
Sinox! Wake up. :-)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Computerworld tilbyder specialiserede kurser i database-management

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester