Trädvy Permalänk
Medlem
Plats
Stockholm
Registrerad
Mar 2015

T-SQL - Hjälp sökes

Tjenis,

Jag skall skapa en rapport som visar lite information och blir inte klok på hur jag skall få till det.

Först och främst är jag rätt grön inom området. Har bara pysslat med detta lite till och från (blir oftast inte mer avancerat än vanliga selects) och vill "up my game" så att säga.

Därför har jag börjat spåna fram rapporter som skulle vara kul att ha, eller som faktiskt är användbara.

Rapporten är en slags "Top 5"-lista som skall göra detta:

- Räkna ihop alla värden i en kolumn (låt säga ett nummer) och skriva ut hur många gånger det värdet finns.
- Göra detta och skriva ut dom 5 mest förekommande numren.

Exempel på hur jag vill att resultatet skall se ut (sorterar dock i storleksordning sen såklart):

╔════════╦═══════╗ ║ Nummer ║ Antal ║ ╠════════╬═══════╣ ║ 42 ║ 542 ║ ║ 12 ║ 11 ║ ║ 596 ║ 475 ║ ║ 1 ║ 4 ║ ║ 5831 ║ 588 ║ ╚════════╩═══════╝

Frågan är bara hur jag räknar alla specifika värden i min "Nummer"-kolumn i min "Tabell", räknar ihop och får ut i en rad likt exemplet ovan. Vi snackar alltså en tabell där det finns 10+ kolumner och där "Nummer" kan förekomma mer än 100.000 gånger.

Är jag för oklar så säg gärna till. Blir snurrig i skallen när jag inte får ihop saker och ting.

Edit:

Jag har för tillfället denna sökning klar, men är osäker på om den verkligen gör rätt sak. Den vill t.ex inte kunna gruppera via 'Antal'.

SELECT Nummer, COUNT(*) as Antal FROM Tabell WHERE Kundnummer = 12345 AND StartDatum BETWEEN '2016-04-06 12:00:00' AND '2016-04-06 19:00:00' GROUP BY Nummer

Trädvy Permalänk
Medlem
Plats
Borås
Registrerad
Jul 2004

Det du söker heter Group by

https://msdn.microsoft.com/en-us/library/ms177673.aspx

T.ex.

SELECT Nummer, COUNT(*) Antal FROM [Artiklar] GROUP BY Nummer

Speldator: SB i7-2600k @ 4,5Ghz P8Z68-V Pro, 16GB DDR3, GTX1070
Server 1: SB 2500k, MZI -P67GD55, 32GB DDR3, Corsair MX 240GB SSD
Surface Pro 2017, Konsoler: Typ alla, Oculus Rift

Trädvy Permalänk
Medlem
Plats
Malmö
Registrerad
Jun 2011

SELECT TOP 5 Nummer, COUNT(Nummer) as ANTAL
FROM Artiklar
GROUP BY Nummer
ORDER BY COUNT(Nummer) DESC

Något sådant kanske kan gå?

Trädvy Permalänk
Medlem
Plats
Stockholm
Registrerad
Mar 2015
Skrivet av MugiMugi:

Det du söker heter Group by

https://msdn.microsoft.com/en-us/library/ms177673.aspx

T.ex.

SELECT Nummer, COUNT(*) Antal FROM [Artiklar] GROUP BY Nummer

Precis vad jag använder, missade att ta med det från början. Tack ändå!

Skrivet av Auo:

SELECT TOP 5 Nummer, COUNT(Nummer) as ANTAL
FROM Artiklar
GROUP BY Nummer
ORDER BY COUNT(Nummer) DESC

Något sådant kanske kan gå?

Ah, så ORDER BY fungerar bra efter GROUP BY (vet att jag gjort missen att försöka använda ORDER BY istället för GROUP BY ett par gånger).

Verkar hur som helst fungera rätt bra när jag kastade in

ORDER BY Antal DESC

Trädvy Permalänk
Medlem
Plats
Stockholm
Registrerad
Mar 2015

Tänkte komma med en följdfråga nu när det verkar fungera bra, samt be om lite feedback på min SQL (formatering, förbättringar osv).

Då jag tänkte söka på allt över ett år (eller mer) och det är så sjukt mycket data, går det att optimera sökningen på något sätt? Finns säkert över 1 miljon nummer att harva igenom under ett år.

Såhär ser hela "selecten" ut (mina deklarationer kanske är överflödiga, men jag tycker att det blir snyggare så, samt kan vara användbart till andra rapporter):

DECLARE @KundNr AS INT DECLARE @FromDate AS DATE DECLARE @ToDate AS DATE SET @KundNr = 11111 SET @FromDate = '2015-01-01' SET @ToDate = DATEADD(dd, 1, @FromDate) -- Ändra 'dd' till 'yy' för årsperiod SELECT TOP 5 Nummer, COUNT(*) as Antal FROM Tabell WHERE Kundnr = @KundNr AND Datum BETWEEN @FromDate AND @ToDate AND Nummer IS NOT NULL GROUP BY Nummer ORDER BY Antal DESC

Trädvy Permalänk
Medlem
Plats
Stockholm
Registrerad
Apr 2006

Se till att du har index på kundnr, datum och number eftersom du använder dessa 3 kolumner i din where clause. Se till att du underhåller indexen så de inte blir för fragmenterade.

INTEL CORE I7 3930K 3.20GHZ 12MB S-2011, FRACTAL DESIGN MIDITOWER DEFINE R3, CORSAIR HX 1050W, ASUS RAMPAGE IV FORMULA, Asus STRIX GTX970, CORSAIR 16GB DDR3 DOMINATOR QUAD 1866MHZ CL9 (4X4GB) Ljud: ASUS Xonar D2X/XDT 7.1 | Elac 5.1 +förstärkare | Cambridge dacmagic plus | Astro gaming A40 | Sennheiser HD 650
You ask me if I have a god complex? Let me tell you something, I am god!

Trädvy Permalänk
Medlem
Plats
Stockholm
Registrerad
Mar 2015

Måste uppdatera min fråga angående den här lilla rapporten nu.

Den fungerade ju fint som det var, men nu vill jag göra den lite mer "avancerad".

Blir helt galen då jag verkligen inte kan greppa hur jag skall göra följande:

- Plocka ut det mest förekommande numret för varje månad och skriva hur många gånger det förekommer.

Tanken är att skapa en rapport där man bara skriver in ett år och får upp topp-numret för varje månad under året.

Såhär ungefär:

╔══════════════════╦═════════════╦═══════╗ ║ MostCalledNumber ║ TimesCalled ║ Month ║ ╠══════════════════╬═════════════╬═══════╣ ║ 888 ║ 4511 ║ JAN ║ ║ 144 ║ 123 ║ FEB ║ ║ 90200 ║ 865 ║ MAR ║ ╚══════════════════╩═════════════╩═══════╝

Jag har skrivit om hela frågan (egentligen för att lära mig snabbare och bara använda tidigare sökningar som referens om det behövs) så att den ser ut såhär just nu:

SELECT YEAR(Tidpunkt) AS År, MONTH(Tidpunkt) AS Månad, COUNT(Nummer) AS Antal FROM Tabell1 WHERE KundNr = 12345 AND Tidpunkt BETWEEN '2015-01-01' AND '2015-12-31' AND Nummer IS NOT NULL AND Nummer NOT IN ('888', '144') GROUP BY YEAR(Tidpunkt), MONTH(Tidpunkt) ORDER BY Antal DESC

Har googlat mig gråhårig men hittar inte (vad jag kan förstå i alla fall) det jag letar efter.

Måste jag skapa en temporär tabell där jag specificerar alla månader och joina den på något sätt? Är som sagt helt lost och sover typ dåligt för att jag blir så irriterad över detta :).

Skrivet av IceDread:

Se till att du har index på kundnr, datum och number eftersom du använder dessa 3 kolumner i din where clause. Se till att du underhåller indexen så de inte blir för fragmenterade.

Får ta mig en titt på index när jag har tid, det kan nog vara bra att kunna (precis som allt annat känns det som).

Trädvy Permalänk
Medlem
Plats
Stockholm
Registrerad
Apr 2006

@drwlz
Lite trött så du får en liten fuling men lätt, testa detta.
Lägg till number i din group by.
Därefter är att ta hela din kod - order by och lägg in mellan ... : select år, månad, max(antal) from (...) as x order by

INTEL CORE I7 3930K 3.20GHZ 12MB S-2011, FRACTAL DESIGN MIDITOWER DEFINE R3, CORSAIR HX 1050W, ASUS RAMPAGE IV FORMULA, Asus STRIX GTX970, CORSAIR 16GB DDR3 DOMINATOR QUAD 1866MHZ CL9 (4X4GB) Ljud: ASUS Xonar D2X/XDT 7.1 | Elac 5.1 +förstärkare | Cambridge dacmagic plus | Astro gaming A40 | Sennheiser HD 650
You ask me if I have a god complex? Let me tell you something, I am god!

Trädvy Permalänk
Medlem
Plats
Stockholm
Registrerad
Mar 2015
Skrivet av IceDread:

@drwlz
Lite trött så du får en liten fuling men lätt, testa detta.
Lägg till number i din group by.
Därefter är att ta hela din kod - order by och lägg in mellan ... : select år, månad, max(antal) from (...) as x order by

Tack, skall testa imorrn!