Fetstil Fetstil Kursiv Understrykning linje färgläggning tabellverk Punktlista Nummerlista Vänster Centrerat högerställt Utfyllt Länk Bild htmlmode
  • Forum & Blog
    • Forum - översikt
      • .Net
        • asp.net generellt
        • c#
        • vb.net
        • f#
        • silverlight
        • microsoft surface
        • visual studio .net
      • databaser
        • sql-server
        • databaser
        • access
        • mysql
      • mjukvara klient
        • datorer och komponenter
        • nätverk, lan/wan
        • operativsystem
        • programvaror
        • säkerhet, inställningar
        • windows server
        • allmänt
        • crystal reports
        • exchange/outlook
        • microsoft office
      • mjukvara server
        • active directory
        • biztalk
        • exchange
        • linux
        • sharepoint
        • webbservers
        • sql server
      • appar (win/mobil)
      • programspråk
        • c++
        • delphi
        • java
        • quick basic
        • visual basic
      • scripting
        • asp 3.0
        • flash actionscript
        • html css
        • javascript
        • php
        • regular expresssion
        • xml
      • spel och grafik
        • DirectX
        • Spel och grafik
      • ledning
        • Arkitektur
        • Systemutveckling
        • krav och test
        • projektledning
        • ledningsfrågor
      • vb-sektioner
        • activeX
        • windows api
        • elektronik
        • internet
        • komponenter
        • nätverk
        • operativsystem
      • övriga forum
        • arbete karriär
        • erbjuda uppdrag och tjänster
        • juridiska frågor
        • köp och sälj
        • matematik och fysik
        • intern information
        • skrivklåda
        • webb-operatörer
    • Posta inlägg i forumet
    • Chatta med andra
  • Konto
    • Medlemssida
    • Byta lösenord
    • Bli bonsumedlem
    • iMail
  • Material
    • Tips & tricks
    • Artiklar
    • Programarkiv
  • JOBB
  • Student
    • Studentlicenser
  • KONTAKT
    • Om pellesoft
    • Grundare
    • Kontakta oss
    • Annonsering
    • Partners
    • Felanmälan
  • Logga in

Hem / Forum översikt / inlägg

Posta nytt inlägg


Problem att lista produkter

Postades av 2008-07-01 15:24:02 - Marcus Wennerberg, i forum databaser, Tråden har 19 Kommentarer och lästs av 1724 personer

Har följande:

<code>
SELECT p.Name, c.Name AS CategoryName
FROM Product AS p

INNER JOIN Category AS c
ON c.CategoryId = p.CategoryId
</code>


I stället för en lång rad, vill jag få ut CategoryName som kolumnnamn, samt ska produktens namn listas under, typ:

Nuvarande:
<code>
Produkt----Kategori
Film1------Drama
Film4------Drama
Film2------Komedi
Film3------Komedi
</code>


Vill ha:
<code>
Drama-----Komedi----osv...
Film1-----Film2-----osv...
Film3-----Film4-----osv...
</code>


Hur löser man detta??

Anv: Oracle

Tacksam för all hjälp


Svara

Sv: Problem att lista produkter

Postades av 2008-07-01 16:42:21 - Niklas Jansson

Du har tre olika varianter;

1. Antingen löser du det i kod, dvs. börja med:

<code>
SELECT p.Name, c.Name AS CategoryName
FROM Product AS p
INNER JOIN Category AS c
ON c.CategoryId = p.CategoryId
ORDER BY c.CategoryId
</code>
Loopa sen igenom och vid varje byte av category-id, lägger du till en kolumn.

2. Plocka ut varje CategoryId för sig;

<code>
ids = sql("SELECT UNIQUE CategoryID, CategoryName FROM Category");
for each id in ids
this_cat = sql("SELECT Name FROM Product WHERE CategoryId = ?", id)
next
</code>

Och hantera återigen varje kolumn för sig.

3. Skapa en stor tabell av alltihop. Mycket fult och opraktiskt. Du får göra något i stil med 2 och dynamiskt bygga upp fler och fler kategorier. Inte enkelt, inte snyggt, inte bra.

(Sen finns alternativ 4; leta reda på någon form av pivoterings-möjlighet i databasmotorn)


Svara

Sv:Problem att lista produkter

Postades av 2008-07-02 09:11:47 - Marcus Wennerberg

ok, tack.

Om man ska köra på det första alternativet. Hur gör man när man loopar igenom och ska skapa en ny kolumn?


Svara

Sv: Problem att lista produkter

Postades av 2008-07-02 11:44:01 - Niklas Jansson

Det framgår inte vad du skriva ut det till, är det html är det svårt. Kör du något serverspråk kanske det finns typ table.addColumn eller liknande?

En annan variant är att hämta ut alla kolumner först, och sen bara fylla på rad för rad från tabellen du har fått ut.

Ett annat alternativ är att skriva om tabellen till en 2d-array istället, som ser ut som du vill ha den, i praktiken samma sak som alternativ 3 ovan, men du slipper försöka lösa det i databasen.


Svara

Sv:Problem att lista produkter

Postades av 2008-07-02 18:51:49 - Marcus Wennerberg

ok, tack. Går kanske att göra på presentations-delen, men hade varit smidigare i sql-satsen.
Det går inte att lösa med någon matris?


Svara

Sv: Problem att lista produkter

Postades av 2008-07-02 23:13:27 - Niklas Jansson

Det är som sagt alternativ 3, bygga upp en sql-sats dynamiskt. En tabell är inte tänkt på det sättet som du vill använda den, det är därför det blir så krångligt. Jag är inte ens säker på att det går.

Du får i princip hämta ut varje kolumn först:
SELECT ... WHERE cat = "Drama"

=>
A
B
C
...

Och sen lägga på ett ordningsnummer (det är det jag inte är säker på hur man gör om det ens går), så att du får:

A 1
B 2
C 3
...

Och sen göra samma sak med alla andra kategorier, och sen göra en stor ful outer join-kedja, på detta ordningsnummer.

((SELECT ... ordningsnr WHERE cat = "Drama" ... [få in ordningsnummer]) OUTER JOIN
(SELECT ... ordningsnr WHERE cat = "Komedi" ... [få in ordningsnummer]) ON ordningsnr) OUTER JOIN ...)


Svara

Sv:Problem att lista produkter

Postades av 2008-07-02 23:44:46 - Marcus Wennerberg

ok, tack. SÅ man kan nästan säga att det är omöjligt att göra detta helt dynamiskt i sql satsen?

Får annars försöka lösa det på presenttionssidan.


Svara

Sv: Problem att lista produkter

Postades av 2008-07-02 23:50:30 - Niklas Jansson

"Nästan säga" kan jag gå med på. Om det går är det ett helvete. Observera dock att det <b>kan</b> finnas inbyggda historier som löser det.

Tänk på vad en tabell beskriver, ett antal tupler, av en specifik typ. I det här fallet blir tupeln olika lång beroende på antalet kategorier, dess innehåll är n likadana orelaterade grejer, där vissa av dem ibland är tomma, beroende på i vilken ordning de står.

Att lägga upp dem i en tabell är en typisk presentationsdel,


Svara

Sv:Problem att lista produkter

Postades av 2008-07-03 10:02:35 - Marcus Wennerberg

ok, tack så mycket.

har en annan liten fundering på lösning,
<code>
Film-------Drama-----Komedi----osv...
Film1--------X-------- -----
Film2--------------------X---------
Film3-------X--------- -----
</code>
Går det att få till en sådan matris? eller är det kanske lika svårt?


Svara

Sv: Problem att lista produkter

Postades av 2008-07-03 11:22:51 - Niklas Jansson

Ja, det är rimligt eftersom en film egentligen borde kunna ha fler än en kategori, dessutom.
Det borde vara lite enklare, även om du måste generera sql-en dynamiskt.

En kolumn kunde då vara antingen något i stil med:
SELECT ID, IIF(cat = "Drama", "X", "") AS ok1 FROM Filmer

Och sen får du bygga upp en stor join av dessa;
SELECT ID, IIF(cat = "Drama", "X", "") AS ok1 FROM Filmer LEFT JOIN
SELECT ID, IIF(cat = "Komedi", "X", "") AS ok2 FROM Filmer ON ID
...

Är dock osäker på om du har tillgång till IIF.

I så fall kan du istället göra enligt:
((SELECT ID, "X" AS ok1 FROM Filmer WHERE cat = "Drama")
UNION ALL
(SELECT ID, "" AS ok1 FROM Filmer WHERE NOT cat = "Drama"))

För en rad, och sen slå ihop dem på samma sätt som ovan.


Svara

Sv:Problem att lista produkter

Postades av 2008-07-06 10:51:20 - Marcus Wennerberg

kanon, tusen tack Niklas. Men är det möjligt att hämta ut alla kategorierna dynamiskt istället för att manuellt sitta o skriva i varje för hand? finns ett antal kategorier


Svara

Sv: Problem att lista produkter

Postades av 2008-07-06 11:01:28 - Håkan Borneland

Du kriver i den här tråden (första inlägget) att du använder Oracle,
men i de andra trådarna här så använder du SQL Server.
Är det så, eller har du blandat ihop det?


Svara

Sv:Problem att lista produkter

Postades av 2008-07-06 11:21:35 - Marcus Wennerberg

det är oracle som gäller (y)


Svara

Sv: Problem att lista produkter

Postades av 2008-07-06 11:45:21 - Håkan Borneland

Ok.


Svara

Sv: Problem att lista produkter

Postades av 2008-07-06 16:38:07 - Niklas Jansson

<b>>Men är det möjligt att hämta ut alla kategorierna dynamiskt istället för att manuellt sitta o skriva i varje för hand? finns ett antal kategorier</b>
Jo, det förstås. Om inte annat kan de ju ändras.

Du får helt enkelt köra typ (pseudo)

categories = sql("SELECT id FROM Categories")
for each category
str = str &
'(SELECT ID, "X" AS ok1 FROM Filmer WHERE cat = ' & category & ')
UNION ALL
(SELECT ID, "" AS ok1 FROM Filmer WHERE NOT cat = ' & category & ')' & ' join ... '
next category

table = sql (str)

Sen har du två alternativ, antingen tar du med alla kategorier, eller alla som används. Vill du bara ha de som används kan du byta ut första raden mot:
categories = sql("SELECT UNIQUE cat FROM Filmer")

Men det här skulle jag rekommendera att du gör i små, små steg, så att det blir rätt. Se till att kolla på SQL-strängen innan du anropar den. Du hade väl inte skrivit vilket språk du använder så då är det svårt att ge konkreta tips.


Svara

Sv:Problem att lista produkter

Postades av 2008-07-18 13:21:08 - Marcus Wennerberg

kanon, tack.

Har en liten ny fundering. Tänkte göra en enklare meny.

Har följande:
<code>
CURSOR c_name IS
SELECT Name FROM Filmer ORDER BY Name ASC;
text varchar(30);
BEGIN
OPEN c_name;
LOOP
FETCH c_name into text;
EXIT WHEN c_name%NOTFOUND;



//testar utskrift
Dbms_output.put_line(text);
END LOOP;
CLOSE c_name;
</code>

Denna skriver ut filmerna, men jag vill ha med alla kategorier direkt under varje film dvs:
<code>
Text---------Typ
Film1--------0
Kategori1---1
Kategori2---1
Film2--------0
Kategori1---1
Kategori2---1
</code>


Går det att göra detta??


Tacksam för all hjälp


Svara

Sv: Problem att lista produkter

Postades av 2008-07-18 17:31:38 - Niklas Jansson

Använder aldrig cursors, men jag antar att du borde kunna lägga till en extra cursor bara som pekar på kategorin istället?

Personligen löser jag det alltid genom att hämta en tabell (eller motsvarande) och använda den i presentationen istället. Alltså, låta databasen vara databas, hantera presentation utanför.


Svara

Sv:Problem att lista produkter

Postades av 2008-07-18 19:22:54 - Marcus Wennerberg

har försökt med en nästlad loop:
<code>
CURSOR c_name IS
SELECT Name FROM Filmer ORDER BY Name ASC;
text varchar(30);

BEGIN
OPEN c_name;
LOOP
FETCH c_name into text;
EXIT WHEN c_name%NOTFOUND;

//testar utskrift
Dbms_output.put_line(text);

CURSOR c_category IS
SELECT k.Name FROM Kategori k inner join Film f on(f.cId=c.id) WHERE f.Name = c_name
kategori varchar(30);

BEGIN
OPEN c_category;
LOOP
FETCH c_category into kategori;
EXIT WHEN c_category%NOTFOUND;

//testar utskrift
Dbms_output.put_line(c_category);

END LOOP;
CLOSE c_category;


END LOOP;
CLOSE c_name;
</code>

Men får felmeddelandet:
Encountered the symbol "C_NAME" when expecting one of the following: := . ( @ % ;

på:
CURSOR c_name IS


Man anv väll inte @ i Oracle??


Svara

Sv: Problem att lista produkter

Postades av 2008-07-19 10:57:42 - Niklas Jansson

Enligt http://www.orafaq.com/wiki/PL/SQL_FAQ verkar det som att du borde skippa open-fetch-grejen och göra något ganska enkelt i stil med:

BEGIN
FOR cursor1 IN (SELECT Name FROM Filmer ORDER BY Name ASC)
LOOP
DBMS_OUTPUT.PUT_LINE(cursor1.column1);
FOR cursor2 IN (SELECT k.Name FROM Kategori k inner join Film f on(f.cId=c.id) WHERE f.Name = c_name ORDER BY f.Name)
LOOP
DBMS_OUTPUT.PUT_LINE(cursor2.column1);
END LOOP
END LOOP;
END;


Om du vill fortsätta med den koden du har, tror jag att du måste lägga andra deklarationen först (alltså alla deklarationer först, sen kod).

Beware - jag kan inte de här grejerna ordentligt.


Svara

Sv:Problem att lista produkter

Postades av 2008-07-24 11:07:54 - Marcus Wennerberg

kanon, tack så mycket för hjälpen


Svara

Nyligen

  • 18:42 Hvor finder man håndlavede lamper
  • 18:41 Hvor finder man håndlavede lamper
  • 16:36 Allt du behöver veta om keramiskt
  • 16:14 Vem anlitar man egentligen när tak
  • 16:14 Vem anlitar man egentligen när tak
  • 16:13 Vem anlitar man egentligen när tak
  • 11:52 Noen erfaring med uttak hos Mostbe
  • 11:51 Noen erfaring med uttak hos Mostbe

Sidor

  • Hem
  • Bli bonusmedlem
  • Läs artiklar
  • Chatta med andra
  • Sök och erbjud jobb
  • Kontakta oss
  • Studentlicenser
  • Skriv en artikel

Statistik

Antal besökare:
Antal medlemmar:
Antal inlägg:
Online:
På chatten:
4 570 570
27 958
271 741
5 813
0

Kontakta oss

Frågor runt konsultation, rådgivning, uppdrag, rekrytering, annonsering och övriga ärenden. Ring: 0730-88 22 24 | pelle@pellesoft.se

© 1986-2013 PelleSoft AB. Last Build 4.1.7169.18070 (2019-08-18 10:02:21) 4.0.30319.42000
  • Om
  • Kontakta
  • Regler
  • Cookies