Permalänk
Medlem

Hjälp med SQL

Dessa SQL frågor..

Jag har en tabell som innehåller massor av artiklar. När den har saldo=1 i saldo-kolumnen finns den i lagret. När den är satt till 0 har den således levererats men det finns alltså en "logg" kvar.

Jag vill ta fram alla fack och hyllor som och antalet artiklar per fack-hylla.

SELECT fack, hylla, COUNT(saldo) AS antalet FROM Storeage WHERE (saldo = 1) GROUP BY fack,hylla ORDER BY fack,hylla

Har kommit så här långt, men som ni märket visas bara lagerplatser för alla fack och hyllor som innehåller artiklar, vilket jag vill ha.
Men jag vill också visa alla fack och hyllor som är tomma. (dvs ingen artikel har saldo=1)

Hur gör jag, har testat med having, men jag listar bara allt (inkl loggen) med det.

Har nån någon bra idé?

Visa signatur

K#

Permalänk

Kan du inte bara ta bort din WHERE, så får du allt?

annars kan man väll använda ett OR.
WHERE (saldo = 1) OR (saldo = 0)

Permalänk
Medlem

Problemet är att jag får ALLT som har saldo=0 uppräknat i count.
När en artikel finns har den saldo=1, när den inte finns är saldot=0. Jag har alltså tusentals artiklar som ligger som saldo=0, även i lagerplatser där det finns saldo=1 givetvis.
Jag vill inte visa vad som finnits historiskt, utan vad som finns nu..

Tar jag bort where eller sätter or saldo=0 får jag fram alla artiklar som nånsin funnits i lagret..

Visa signatur

K#

Permalänk
Medlem

förstår inte riktigt vad du vill få ut.

"Men jag vill också visa alla fack och hyllor som är tomma. (dvs ingen artikel har saldo=1)"

"Jag har alltså tusentals artiklar som ligger som saldo=0, även i lagerplatser där det finns saldo=1 givetvis."

"Jag vill inte visa vad som finnits historiskt, utan vad som finns nu."

vad menar du med detta?

Vill du ha alla fack, hylla som inte har någon data alls? beroende på databas så kunde du söka på NULL

Visa signatur

"Det här systemet fungerar urkasst." - operatör.
"Hur ska det fungera då?" - jag
"Gör så att det fungerar som jag vill." - operatör.
/facepalm

Permalänk
Medlem

Jo..

Enligt min SQL-fråga så får jag ut alla lagerplatser som innehåller artiklar. så långt är jag med. (530st) Men totalt har jag 800 lagerplatser. Jag har alltså 270 lagerplatser som inte visas i min SQL-fråga för att de inte har någon artikel med saldo=1, dvs ingen i lager.

Saldo kan alltså bara vara 0 eller 1. Har jag 2st i lager finns det 2st rader i tabellen som är satt till 1.
Saldo är alltså inte något saldo utan en flagga om den finns eller inte.

Vet inte hur jag ska få till att visa lagerplatser som har count(saldo)=0 så att säga..

Visa signatur

K#

Permalänk
Medlem

SELECT fack, hylla, saldo, COUNT(saldo) AS antalet
FROM Storeage
GROUP BY fack,hylla, saldo
ORDER BY fack,hylla, saldo

Testat det?

Visa signatur

Speldator: Intel i5-7600K @4,95Ghz - BeQuiet PureRock - MSI Z170A SLI Plus - Corsair RM550x - Asus RTX 2070 ROG Strix Advanced 8GB - MSI Optix MAG271CQR 27” 1440p 144hz - 8Gb Corsair Vengeance 2400Mhz DDR4 - Samsung 850 Evo + WD Black M.2 SSD - NZXT S340

Jobbdator: HP Elitebook X360 2018 - 16Gb DDR4 - 256Gb PCI-e SSD - Intel i7-8650U

Konsol: Xbox Series X

Permalänk
Medlem

@atman: Om jag fattar dig rätt, du vill veta vilka artiklar du har i lager, och lista alla tillhörande lagerplatser även om det inte finns en artikel på just den platsen?

Du får jättegärna modellera din databas på http://sqlfiddle.com/ så kan du få bättre hjälp av oss.

Visa signatur

Jag är en optimist; det är aldrig så dåligt så att det inte kan bli sämre.

Permalänk
Medlem
Skrivet av atman:

Dessa SQL frågor..

Jag har en tabell som innehåller massor av artiklar. När den har saldo=1 i saldo-kolumnen finns den i lagret. När den är satt till 0 har den således levererats men det finns alltså en "logg" kvar.

Jag vill ta fram alla fack och hyllor som och antalet artiklar per fack-hylla.

SELECT fack, hylla, COUNT(saldo) AS antalet FROM Storeage WHERE (saldo = 1) GROUP BY fack,hylla ORDER BY fack,hylla

Har kommit så här långt, men som ni märket visas bara lagerplatser för alla fack och hyllor som innehåller artiklar, vilket jag vill ha.
Men jag vill också visa alla fack och hyllor som är tomma. (dvs ingen artikel har saldo=1)

Hur gör jag, har testat med having, men jag listar bara allt (inkl loggen) med det.

Har nån någon bra idé?

Om jag förstår dig rätt..

SELECT fack, hylla, SUM(saldo) AS antalet FROM Storeage GROUP BY fack,hylla ORDER BY fack,hylla

Visa signatur

Kom-pa-TI-bilitet

Permalänk
Medlem
Skrivet av zyberzero:

@atman: Om jag fattar dig rätt, du vill veta vilka artiklar du har i lager, och lista alla tillhörande lagerplatser även om det inte finns en artikel på just den platsen?

Du får jättegärna modellera din databas på http://sqlfiddle.com/ så kan du få bättre hjälp av oss.

Precis, har fått till det att det visar antalet samt vilka lagerplatser. Men jag hade varit hjälpt av att det listar lagerplatserna som är tomma också.

Kikar om jag får till det på siten.

Visa signatur

K#

Permalänk
Medlem
Skrivet av atman:

Precis, har fått till det att det visar antalet samt vilka lagerplatser. Men jag hade varit hjälpt av att det listar lagerplatserna som är tomma också.

Kikar om jag får till det på siten.

Då blir det relativt enkelt, jag skulle löst det med en subquery. Först en query för att klura ut vilka prylar du har i lager - jag antar att alla prylar har ett artikelnummer:

SELECT artikelnummer FROM storage GROUP BY artikelummer HAVING SUM(saldo) > 0

Denna fråga ger alltså alla artikelnummer som finns i ditt lager. Låt oss säga att för att ta reda på vilka lagerplatser en viss artikel har, så skulle frågan kunna se ut så här:

SELECT artikelnr, hylla, fack, saldo FROM Storage WHERE artikelnr = 12345

Om vi då parar ihop dessa får vi följande:

SELECT artikelnr, hylla, fack, saldo FROM Storage WHERE artikelnr in (SELECT artikelnummer FROM storage GROUP BY artikelummer HAVING SUM(saldo) > 0)

Och då får du en tabell som troligen ser ut något så här:

+-----------+-------+------+-------+ | Artikelnr | Hylla | Fack | Saldo | +-----------+-------+------+-------+ | 12345 | A | 12 | 0 | | 12345 | A | 13 | 1 | | 99999 | B | 2 | 42 | +-----------+-------+------+-------+

Låter det rimligt?

Visa signatur

Jag är en optimist; det är aldrig så dåligt så att det inte kan bli sämre.

Permalänk

När man har problem att få en query som gör allt i ett svep är oftast UNION ALL trevligt. Den slår ihop svaret av två querys med samma kolumner till ett svar.

Då kan skriva om frågan som:

Query som ger alla som finns i lager
UNION ALL
Query som ger alla som inte finns i lager

Om det kan finnas överlapp kan man skippa nyckelordet ALL. Då tar den endast med unika rader men blir något långsammare.

Permalänk
Tangentbordskonnässör

Vet inte om jag misstolkar din fråga, men borde det inte bara vara att köra följande query ?

SELECT fack, hylla, saldo FROM Storeage WHERE saldo >= 1 GROUP BY fack,hylla ORDER BY fack,hylla

Permalänk
Medlem
Skrivet av zyberzero:

+-----------+-------+------+-------+ | Artikelnr | Hylla | Fack | Saldo | +-----------+-------+------+-------+ | 12345 | A | 12 | 0 | | 12345 | A | 13 | 1 | | 99999 | B | 2 | 42 | +-----------+-------+------+-------+

Låter det rimligt?

Du är helt klart på rätt spår!
Det enda är att jag inte vill ha med artikelnr med i bilden. Vill bara ha hylla, fack och antalet.
För om jag gör som ovan kommer jag få med tusentals artikelnr som är 0 till antalet i och med att de ligger kvar som historik.

Saldo är alltså inte saldot som det ser ut i tabellen, det är egentligen bara en flagga som visar att artikeln finns i lagret. Ett artikelnr är unikt för just den artikeln. Finns det flera poster av ett nummer är det samma artikel som visar historik. Saldo-flaggan kan bara vara 0 eller 1.

SELECT hylla, fack, COUNT(artikelnr) AS antal FROM Storeage WHERE (saldo = 1) GROUP BY hylla, fack ORDER BY hylla, fack

Denna koden ovan visar helt rätt, förutom att jag inte ser alla lagerplatser med count(artikelnr) 0st saldo=1 så att säga..
Vill kombinera ovan med att visa lagerplatser som är tomma så listan blir komplett.

Det är kanske är ganska unikt upplagd databas, kanske därför det är svårt att förstå hur den är uppbyggd. Anledningen är att kunna följa en artikel historiskt är en central del i hanteringen.

Visa signatur

K#

Permalänk
Medlem
Skrivet av atman:

Du är helt klart på rätt spår!
Det enda är att jag inte vill ha med artikelnr med i bilden. Vill bara ha hylla, fack och antalet.
För om jag gör som ovan kommer jag få med tusentals artikelnr som är 0 till antalet i och med att de ligger kvar som historik.

Saldo är alltså inte saldot som det ser ut i tabellen, det är egentligen bara en flagga som visar att artikeln finns i lagret. Ett artikelnr är unikt för just den artikeln. Finns det flera poster av ett nummer är det samma artikel som visar historik. Saldo-flaggan kan bara vara 0 eller 1.

SELECT hylla, fack, COUNT(artikelnr) AS antal FROM Storeage WHERE (saldo = 1) GROUP BY hylla, fack ORDER BY hylla, fack

Denna koden ovan visar helt rätt, förutom att jag inte ser alla lagerplatser med count(artikelnr) 0st saldo=1 så att säga..
Vill kombinera ovan med att visa lagerplatser som är tomma så listan blir komplett.

Det är kanske är ganska unikt upplagd databas, kanske därför det är svårt att förstå hur den är uppbyggd. Anledningen är att kunna följa en artikel historiskt är en central del i hanteringen.

Har du testat SQL-satsen jag skrev ovanför?

Visa signatur

Kom-pa-TI-bilitet

Permalänk
Medlem
Skrivet av Teknocide:

Har du testat SQL-satsen jag skrev ovanför?

Jisses!
Helt rätt!, var helt insnöad på a count. men såklart om man använder sum så räknas antalet saldo-flaggor och visar då antalet.

TACK för hjälpen!, det var mer basic än jag trodde.

Visa signatur

K#