Testar följande SQL Sats Du skall nog kika på CASE istället, IIF finns i Access men inte i SQL Server iif finns i access men inte i sql du får använda en case istället Tackar ska testa vidare! Hej Jenny jag får följande fel när jag kör denna kod; du har hoppat över koden med "then" som jag skrev i mitt förra inlägg Får det inte att fungera ERROR: The Query Designer does not support the CASE SQL construct. 1. Fortfarande har du med iif i koden Nu har jag hunnit tittat lite närmare på din kod Jag gör det men fattar inget av det : Det exemplet är en Körde denna och får följande fel: The Query Designer does not support the CASE SQL construct. Blir det samma om du kapar frågan till: Ja det gör det, hittade en länk på SQLTeam http://www.sqlteam.com/forums/topic.asp?TOPIC_ID=41255 Angående att det inte går att köra en SELECT CASE i Query Designer. Man ska köra det i Query Analyzer ok, jag läste designer som analyzer och trodde att du körde det. Men hur dum får man blöi jag kör den ju i views ska testa i QA nu återkommer. Nu får jag ut alla resultat i stigande följd med en decimal. Tack Du måste skriva all kod för parameter Snitt två gånger på ett sådant här sätt (om du vill få ut både och...: Testade detta men får fel nära ELSE rad 2 Du kan inte skriva Res/Ser eftersom Res och Ser är alias och den tredje select parametern kan inte känna till koden för dessa två första parametrar. Ok ska klura lite grann. men vad är det för skillnad på <code>ROUND(AVG(0), 1)</code> och <code>ROUND(AVG(r.Resultat), 1)</code> i denna kod som du hjälpt mig med<code>CASE WHEN r.Resultat IS NULL THEN ROUND(AVG(0), 1) ELSE ROUND(AVG(r.Resultat), 1) END</code> Skillnaden är att när r.Resultat är NULL kan du inte göra en avg(null) Aha men varför blir jag tvungen att skriva GROUP BY m.Namn, r.resultat, r.Serier Det gör ju att jag inte kan gruppera efter m.Namn Så fort en av selectparametrarna använder sig av funktioner, i detta fallet AVG() så krävs det att alla selectparametrarna skrivs i group by. Ok, så i praktiken kan jag inte omvandla min Access fråga till SQL som den är. Hur löser man det rent databasmässigt. Såsom den fråga du har i inlägget mer rubrik "Error! Server: Msg 156", där du använder subquerys. Hej jenny, du måste tycka jag är en idiot! Då börjar vi om... :-) I tabellen Medlemmar har jag Såg att du själv svarat någon minut efter att jag skrev. Vet ej om du sett mitt svar... Hej! Tack ska prova detta. Ser ju bra ut förutom att Sämsta ska bara vara på 4 serier inte om spelaren fått gått av efter 3 el 4 serier. Hej Mickael, --Kolumnlista...Får Error på IIf i SQL sekvens
<code>
ROUND(AVG(IIf(ISNULL(r.Resultat, 0))) AS [Antal serier]
</code>
Men får följande Error; IIF är ett okänt funktionsnamn
Vad har jag missatSv: Får Error på IIf i SQL sekvens
/mickeSv: Får Error på IIf i SQL sekvens
Något i stil med:
<code>
Case when isnull(e.Result, 0) then ROUND(AVG(IIf(ISNULL(r.Resultat, 0))) AS [Antal serier]
else 'något annat alternativ här kanske' end
</code>Sv: Får Error på IIf i SQL sekvens
För min Access rad ser ut spm följer:
<code>
Round(avg(IIF(resultat is null,0,resultat)/IIF(serier is null,1,serier)),1) as Snitt,</code>Sv: Får Error på IIf i SQL sekvens
<code>SELECT m.Namn, SUM(r.Serier) AS [Antal serier], CASE WHEN isnull(r.Resultat, 0) AS [Antal serier]
FROM dbo.medlemmar m INNER JOIN
dbo.Resultat r ON m.ID = r.Spelare
GROUP BY m.Namn</code>
The Query Designer does not support the CASE SQL construct.Sv: Får Error på IIf i SQL sekvens
Läs mer i books online, sql hjälpen som har installerats när du installerat sql.
Sök på case
Från books online:
CASE WHEN Boolean_expression THEN result_expression......Sv: Får Error på IIf i SQL sekvens
<code> SELECT m.Namn,
CASE r.Resultat
WHEN isnull(r.Resultat, 0)
THEN ROUND(AVG(IIf(ISNULL(r.Resultat, 0))) AS [Antal serier] ELSE END)
MAX(r.Resultat) AS Bästa,
MIN(r.Resultat) AS Sämsta
FROM dbo.medlemmar m INNER JOIN
dbo.Resultat r ON m.ID = r.Spelare
WHERE (r.Serier = 4)
GROUP BY m.Namn
ORDER BY MAX(r.Resultat) DESC</Code>Sv: Får Error på IIf i SQL sekvens
2. Du har ingen kod mellan else och end i case villkoret....
Läs gärna fortfarande i books online, där är jättefina exempel som du kan ta efter!Sv: Får Error på IIf i SQL sekvens
det ska vara så här:
<code>
SELECT CASE WHEN r.Resultat is null THEN ROUND(AVG(0), 1) else ROUND(AVG(r.Result), 1) END
</code>
Vad du ska göra om r.resultat = NULL vet jag inte men vad jag kunde läsa från din kod så vill du slänga in en nolla i roundfunktionen vilket jag gjort efter THEN satsen.
Din round funktion hade bara en parameter, det ska vara 2 eller 3, jag satte dit en etta men vad du ska ha det vet jag inte.Sv: Får Error på IIf i SQL sekvens
<code>
USE pubs
GO
SELECT Category =
CASE type
WHEN 'popular_comp' THEN 'Popular Computing'
WHEN 'mod_cook' THEN 'Modern Cooking'
WHEN 'business' THEN 'Business'
WHEN 'psychology' THEN 'Psychology'
WHEN 'trad_cook' THEN 'Traditional Cooking'
ELSE 'Not yet categorized'
END,
CAST(title AS varchar(25)) AS 'Shortened Title',
price AS Price
FROM titles
WHERE price IS NOT NULL
ORDER BY type, price
COMPUTE AVG(price) BY type
GO
</code>
Sorry det är första dan jag håller på med SQL Server 2000 och är väl för insnöad i Access ännu!
Har en tabell Medlemmar och en resultat
Vill få ut snittresultat per medlem med en decimal? Pls.
GertSv: Får Error på IIf i SQL sekvens
Simple CASE function:
jag har beskrivit en
Searched CASE function:
Se mitt senaste inlägg den bör funka bättre.Sv: Får Error på IIf i SQL sekvens
<code>SELECT m.Namn,
CASE WHEN r.Resultat IS NULL THEN ROUND(AVG(0), 1) ELSE ROUND(AVG(r.Resultat), 1) END AS Snitt
FROM dbo.medlemmar m INNER JOIN
dbo.Resultat r ON m.ID = r.Spelare</code>
GertSv: Får Error på IIf i SQL sekvens
1
<code>SELECT CASE WHEN r.Resultat IS NULL THEN ROUND(AVG(0), 1) ELSE ROUND(AVG(r.Resultat), 1) END
FROM dbo.Resultat r
</code>
2
<code>
SELECT CASE WHEN r.Resultat IS NULL THEN ROUND(AVG(0), 1) ELSE ROUND(AVG(r.Resultat), 1) END AS Snitt
FROM dbo.Resultat r
</code >Sv: Får Error på IIf i SQL sekvens
Men jag kör på Windows XP så då fungerar inte QA!
Har du andra förslag på hur jag ska göra för att gå runt detta problem?Sv: Får Error på IIf i SQL sekvens
Jag kör QA i xp och det fungerar utmärkt! Varför skulle inte det fungera???
Frågan fungerar också hos mig!Sv: Får Error på IIf i SQL sekvens
Till then tack för ditt engangemang!Sv: Får Error på IIf i SQL sekvens
Om jag nu vill få ut snitt värdet baserat på summa resultat /summa serier per spelare med en decimal.
Så här var det i Access förut: <code>Round(avg(IIF(resultat is null,0,resultat)/IIF(serier is null,1,serier)),1) as Snitt</code>Sv: Får Error på IIf i SQL sekvens
<code>
Select koden_för_parameter_snitt, (koden_för_parameter_snitt) / (koden_för parameter_serier)
</code>
koden_för_parameter:
<code>CASE WHEN r.Resultat IS NULL THEN ROUND(AVG(0), 1) ELSE ROUND(AVG(r.Resultat), 1) END
</code>
koden_för parameter_serier får du göra en liknande Case blir väl nått så här:
<code>CASE WHEN serier IS NULL THEN 1 ELSE serier END
</code>Sv: Får Error på IIf i SQL sekvens
<code>SELECT m.Namn, CASE WHEN r.Resultat IS NULL THEN
ELSE Round(AVG(r.Resultat,1)AS Res
CASE WHEN serier IS NULL THEN
ELSE r.Serier As Ser
Res/SerAS Snitt
FROM dbo.medlemmar m INNER JOIN dbo.Resultat r ON m.ID = r.Spelare
GROUP BY m.Namn
ORDER BY 2 DESC</code>
Får samma fel om jag tar bort AS Res och As Ser Res/SerSv: Får Error på IIf i SQL sekvens
All kod du skrivit före as res, dvs allt mellan case och AS Res ska in före slashen
likadant vad gäller AS Ser efter slashen...
[kod för Res] / [kod för Ser]
(CASE....END) / (CASE....END)Sv: Får Error på IIf i SQL sekvens
Sv: Får Error på IIf i SQL sekvens
därför skrev jag ROUND(AVG(0), 1)
så koden
CASE WHEN r.Resultat IS NULL THEN ROUND(AVG(0), 1) ELSE ROUND(AVG(r.Resultat), 1) END
översatt blir
- om r.Resultat is Null körs ROUND(AVG(0), 1)
- om NOT r.Resultat is Null körs ROUND(AVG(r.Resultat), 1)Sv: Får Error på IIf i SQL sekvens
Error: Server: Msg 8120, Level 16, State 1, Line 1
Kolumnen 'r.Resultat' är ogiltig i urvalslistan eftersom den inte finns i vare sig en aggregeringsfunktion eller i GROUP BY-satsen.
Server: Msg 8120, Level 16, State 1, Line 1
Kolumnen 'r.Serier' är ogiltig i urvalslistan eftersom den inte finns i vare sig en aggregeringsfunktion eller i GROUP BY-satsen.Sv: Får Error på IIf i SQL sekvens
Vet inte varför det krävs dock.Sv: Får Error på IIf i SQL sekvens
Jag har ju en tabell Medlemmar och en tabell Resultat.
Och vill på en rad få ut en spelares snittresultat :
Namn Snitt Antal serier Hemmasnitt Serier hemma Bortasnitt Serier borta Poängsnitt Bästa Sämsta
xxxx 195.8 35 189.3 19 203.9 16 0.77 839 743 Sv: Får Error på IIf i SQL sekvens
Sv: Får Error på IIf i SQL sekvens
Gå och gör något annat som du kanske skulle kunna tänkas klara av.
Men vad jag fattar så är det ju GROUP BY som grupperar och om man då Måste grupperar vid varje Summering eller Medelevärde i en SQL Fråga då kan jman ju inte få ut det på en rad?
Om vi nu har kommit så långt som hit:
<code>
SELECT m.Namn,CAST(AVG(r.Resultat)/Serier AS decimal(12,1))AS Snitt,
(SELECT CAST(AVG(resultat/serier)AS decimal(12,1)) FROM Resultat
WHERE Spelare= ID AND H_B = 'H') AS [Snitt hemma],
(SELECT CAST(AVG(resultat/serier)AS decimal(12,1)) FROM Resultat
WHERE Spelare= ID AND H_B = 'B') AS [Snitt borta]
FROM Medlemmar AS m INNER JOIN Resultat AS r ON m.Id = r.Spelare
GROUP BY m.Namn,ID,r.Resultat,r.Serier</code>
Denna gör ju att jag inte kan få ut en rad, tack vare att jag är tvungen att ha GROUP BY även på Resultat och Serier.Får Error på IIf i SQL sekvens
Skriv in din tabellstruktur, som den ser ut just nu. Gärna med ett par rader exempeldata också.
Skriv sedan din fråga, som den ser ut nu (en som funkar helst)
och skriv sedan hur du vill att resultatet skall se ut egentligen (gärna baserat på exempeldatat)
så skall vi nog fixa till det :)
/mickeSv: Får Error på IIf i SQL sekvens
Nejdå, visst är du ingen idiot! Ibland fastnar man i sitt eget tänk och behöver hjälp att komma loss
Som jag sa sist så behöver du inta använda group by på resultat och serier om du gör subquerys av dessa select parametrar. Jag ser här nedan i din kod att du kommit halvvägs. Select parametern enummer 2 (AS Snitt), efter m.namn, ska ochså bli en (SELECT....) precis som parameter 3 och 4. Eftersom du då kapslar in funktionerna AVG så behöver du endast ha m.Name och ID i group BY. Förstår du?
Din kod:
<code>
SELECT m.Namn,CAST(AVG(r.Resultat)/Serier AS decimal(12,1))AS Snitt,
(SELECT CAST(AVG(resultat/serier)AS decimal(12,1)) FROM Resultat
WHERE Spelare= ID AND H_B = 'H') AS [Snitt hemma],
(SELECT CAST(AVG(resultat/serier)AS decimal(12,1)) FROM Resultat
WHERE Spelare= ID AND H_B = 'B') AS [Snitt borta]
FROM Medlemmar AS m INNER JOIN Resultat AS r ON m.Id = r.Spelare
GROUP BY m.Namn,ID,r.Resultat,r.Serier
</Code>Sv: Får Error på IIf i SQL sekvens
ID int 4 0
Namn nvarchar 50 1 och en massa annat som adress o tfn som jag inte använder här.
Data...
2 Enspelare
5 Enannan
Här är min tabell Resultat
<code>
Nr int 4 0
Spelare int 4 1
Omgang int 4 1
Resultat int 4 1
H_B nvarchar 255 1
Serier float 8 1
Poang float 8 1</code>
Några data...
<code>
85 2 1 718 H 4 3
86 5 1 519 H 3 2
94 5 2 821 B 4 4
106 5 2 810 B 4 3
107 2 2 757 B 4 3
124 5 3 763 H 4 3
125 2 3 793 H 4 3
133 5 4 830 H 4 3
134 2 4 749 H 4 3
142 5 5 792 B 4 1
143 2 5 481 B 3 1
151 5 5 839 B 4 3
152 2 5 712 B 4 3
159 2 6 850 H 4 4
160 2 6 760 H 4 4
161 5 6 743 H 4 4
162 5 6 758 H 4 4</code>
Och här är frågan som jag då vill få ut en rad med mina resultat sorterat på snitt:
<code>
SELECT m.Namn,CAST(AVG(r.Resultat)/Serier AS decimal(12,1))AS Snitt,
(SELECT CAST(AVG(resultat/serier)AS decimal(12,1)) FROM Resultat
WHERE Spelare= ID AND H_B = 'H') AS [Snitt hemma],
(SELECT CAST(AVG(resultat/serier)AS decimal(12,1)) FROM Resultat
WHERE Spelare= ID AND H_B = 'B') AS [Snitt borta]
FROM Medlemmar AS m INNER JOIN Resultat AS r ON m.Id = r.Spelare
GROUP BY m.Namn,ID,r.Resultat,r.Serier
</code>Sv: Får Error på IIf i SQL sekvens
Sv: Får Error på IIf i SQL sekvens
Hur räknar du ut Poängsnitt? (den som blir 0.77) det får jag inte riktigt till...
Annars: Varsågod :)
SELECT Namn,
CAST(AVG(Resultat / Serier) AS decimal(5,1))AS Snitt ,
SUM(Serier) AS [Antal Serier],
CAST(AVG(HemResult / HemSerier) AS decimal(5,1)) AS Hemmasnitt,
SUM(Hemserier) AS [Serier hemma],
CAST(AVG(BortResult / BortSerier) AS decimal(5,1)) AS Bortasnitt,
SUM(Bortserier) AS [Serier borta],
MAX(Resultat) AS Bästa,
MIN(Resultat) AS Sämsta
FROM (
select Namn, Resultat, Serier,
CASE H_B WHEN 'h' THEN Resultat ELSE NULL END AS HemResult,
CASE H_B WHEN 'h' THEN Serier ELSE NULL END AS HemSerier,
CASE H_B WHEN 'b' THEN Resultat ELSE NULL END AS BortResult,
CASE H_B WHEN 'b' THEN Serier ELSE NULL END AS BortSerier
FROM Medlemmar AS m INNER JOIN Resultat AS r
ON m.Id = r.Spelare
) Temp
GROUP BY namn
/micke
Sv: Får Error på IIf i SQL sekvens
Hur räknar du ut Poängsnitt? (den som blir 0.77) det får jag inte riktigt till...
Så här har jag gjort tidigare i Access
<code>
ROUND(SUM(r.poang)/SUM(r.serier),2) as Poängsnitt</code>Sv: Får Error på IIf i SQL sekvens
Skulle du lite allmänt försöka beskriva lite hur dom olika sakerna fungerar tillsammans. Och vad du gör med Temp i din SQLSv: Får Error på IIf i SQL sekvens
SELECT Namn,
CAST(AVG(Resultat / Serier) AS decimal(5,1))AS Snitt ,
SUM(Serier) AS [Antal Serier],
CAST(AVG(HemResult / HemSerier) AS decimal(5,1)) AS Hemmasnitt,
SUM(Hemserier) AS [Serier hemma],
CAST(AVG(BortResult / BortSerier) AS decimal(5,1)) AS Bortasnitt,
SUM(Bortserier) AS [Serier borta],
MAX(Resultat) AS Bästa,
MIN(Resultat) AS Sämsta
--Här har alla kolumner valts ut.
--Beräkningar och liknande görs på kolumnerna som kommer ur temptabellen
FROM (
--Frågan mellan *** kan du köra separat. Den funkar som en temporär tabell
--Jag kallade den för Temp av den orsaken. den kan heta vad som helst
--Den plockar ut data till alla dina kolumner
--*******************************************
select Namn, Resultat, Serier,
CASE H_B WHEN 'h' THEN Resultat ELSE NULL END AS HemResult,
CASE H_B WHEN 'h' THEN Serier ELSE NULL END AS HemSerier,
CASE H_B WHEN 'b' THEN Resultat ELSE NULL END AS BortResult,
CASE H_B WHEN 'b' THEN Serier ELSE NULL END AS BortSerier
FROM Medlemmar AS m INNER JOIN Resultat AS r
ON m.Id = r.Spelare
--********************************************
) Temp --Namngivning av frågan
GROUP BY namn --Och en gruppering - krävs för aggregeringarna.
och såhär ser den ut med resultat (MAX/MIN och det andra)
<code>
SELECT Namn,
CAST(AVG(Resultat / Serier) AS decimal(5,1))AS Snitt ,
SUM(Serier) AS [Antal Serier],
CAST(AVG(HemResult / HemSerier) AS decimal(5,1)) AS Hemmasnitt,
SUM(Hemserier) AS [Serier hemma],
CAST(AVG(BortResult / BortSerier) AS decimal(5,1)) AS Bortasnitt,
SUM(Bortserier) AS [Serier borta],
ROUND(SUM(Resultat)/SUM(Serier),2) as Poängsnitt,
MAX(ResultatPer4Serier) AS Bästa,
MIN(ResultatPer4Serier) AS Sämsta
FROM (
select Namn, Resultat, Serier,
CASE H_B WHEN 'h' THEN Resultat ELSE NULL END AS HemResult,
CASE H_B WHEN 'h' THEN Serier ELSE NULL END AS HemSerier,
CASE H_B WHEN 'b' THEN Resultat ELSE NULL END AS BortResult,
CASE H_B WHEN 'b' THEN Serier ELSE NULL END AS BortSerier,
CASE Serier WHEN 4 THEN Resultat ELSE NULL END AS ResultatPer4Serier
FROM Medlemmar AS m INNER JOIN Resultat AS r
ON m.Id = r.Spelare
) Temp
GROUP BY namn
</code>