Har följande: Du har tre olika varianter; ok, tack. 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? ok, tack. Går kanske att göra på presentations-delen, men hade varit smidigare i sql-satsen. 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. ok, tack. SÅ man kan nästan säga att det är omöjligt att göra detta helt dynamiskt i sql satsen? "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. ok, tack så mycket. Ja, det är rimligt eftersom en film egentligen borde kunna ha fler än en kategori, dessutom. 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 Du kriver i den här tråden (första inlägget) att du använder Oracle, <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> kanon, tack. Använder aldrig cursors, men jag antar att du borde kunna lägga till en extra cursor bara som pekar på kategorin istället? har försökt med en nästlad loop: 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:Problem att lista produkter
<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 Sv: Problem att lista produkter
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)Sv:Problem att lista produkter
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?Sv: Problem att lista produkter
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.Sv:Problem att lista produkter
Det går inte att lösa med någon matris?Sv: Problem att lista produkter
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 ...)Sv:Problem att lista produkter
Får annars försöka lösa det på presenttionssidan.Sv: Problem att lista produkter
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,Sv:Problem att lista produkter
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?Sv: Problem att lista produkter
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.Sv:Problem att lista produkter
Sv: Problem att lista produkter
men i de andra trådarna här så använder du SQL Server.
Är det så, eller har du blandat ihop det? Sv: Problem att lista produkter
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.Sv:Problem att lista produkter
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älpSv: Problem att lista produkter
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.Sv:Problem att lista produkter
<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??Sv: Problem att lista produkter
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.