Hej jag har en ganska klurig SQL fråga och vill nu lägga in en kolumn till som en underfråga. Förstår inte riktigt vad du försöker göra men är det inte smidigare att använda joins istället för subqueries. Det var ett helt nytt tänk, skall testköra imorgon. Återkommer med resultat. Blev så nyfiken körde den i QA men fick följande fel. Svårt att hitta syntaxfel i forumet. Här kommer ytterligare ett sätt att lösa problemet. Hej Pelle, Klippte in det som Pelle hade gett som förslag. Det kan jag köpa, men vad står x för i slutet? Hej Pelle! Om vi går tillbaks till ursprungsfrågan så när jag kör den i Query Builder i Visual Studio så fungerar inte nedan: Testade du med JOIN istället? Nu har jag löst det så här kan det vara.... Nu är jag tillbaka, har inte varit inne här på ett tag.Expression i en underfråga SQL?
(SELECT ROUND(SUM(r.Resultat) / SUM(r.Serier * 1.0), 2, 1)
FROM resultat
WHERE Spelare = s.ID AND H_B = 'H') AS [Snitt hemma],
Men då klagar den enl följande:
Server: Msg 512, Level 16, State 1, Line 1
Subquery returned more than 1 value. This is not permitted when the subquery follows =, !=, <, <= , >, >= or when the subquery is used as an expression.
Hela min SQL kommer här:
SELECT TOP 100 PERCENT s.Namn, SUM(r.Serier) AS [Antal serier],ROUND(SUM(r.Resultat) / SUM(r.Serier * 1.0), 2, 1) AS Snitt,
SUM(r.Poang) AS Poäng,
(SELECT SUM(Serier)
FROM resultat
WHERE Spelare = s.ID AND H_B = 'H') AS [Serier hemma],
(SELECT ROUND(SUM(r.Resultat) / SUM(r.Serier * 1.0), 2, 1)
FROM resultat
WHERE Spelare = s.ID AND H_B = 'H') AS [Snitt hemma],
(SELECT SUM(Poang)
FROM resultat
WHERE Spelare = s.ID AND H_B = 'H') AS [Poäng hemma],
(SELECT SUM(Serier)
FROM resultat
WHERE Spelare = s.ID AND H_B = 'B') AS [Serier borta],
(SELECT SUM(Poang)
FROM resultat
WHERE Spelare = s.ID AND H_B = 'B') AS [Poäng Borta],
ROUND(SUM(r.Poang * 1.0) / SUM(r.Serier), 2) AS [P Snitt], MAX(r.Resultat) AS [Bästa], MIN(r.Resultat) AS [Sämsta]
FROM medlemmar s INNER JOIN
Resultat r ON s.ID = r.Spelare
GROUP BY s.Namn, s.ID
ORDER BY 3 DESC
Sv: Expression i en underfråga SQL?
Det här fungerar förmodligen inte efter som jag inte kan testköra det då jag inte har tabeller eller data men jag kanske når fram med avsikten.
SELECT TOP 100 PERCENT s.Namn, SUM(r.Serier) AS [Antal serier],ROUND(SUM(r.Resultat) / SUM(r.Serier * 1.0), 2, 1) AS Snitt,
SUM(r.Poang) AS Poäng,
SUM(h.Serier) As [Serier hemma],
ROUND(SUM(h.Resultat) / SUM(h.Serier * 1.0), 2, 1) As [Snitt hemma],
SUM(h.Poang) AS [Poäng hemma],
SUM(b.Serier) AS [Serier borta],
SUM(b.Poang) AS [Poäng Borta],
ROUND(SUM(r.Poang * 1.0) / SUM(r.Serier), 2) AS [P Snitt],
MAX(r.Resultat) AS [Bästa], MIN(r.Resultat) AS [Sämsta]
FROM medlemmar s LEFT OUTER JOIN Resultat r ON s.ID = r.Spelare,
LEFT OUTER JOIN Resultat h ON s.ID = h.Spelare,
LEFT OUTER JOIN Resultat b ON s.ID = b.Spelare
WHERE h.H_B = 'H' AND
b.H_B = 'B'
GROUP BY s.Namn, s.ID
ORDER BY 3 DESC
Lycka till.
FredrikSv:Expression i en underfråga SQL?
Server: Msg 156, Level 15, State 1, Line 11
Incorrect syntax near the keyword 'LEFT'.
Med mitt tänk så hjälpte det att ändra fr r.Resultat o r.Serier till att ta bort r. Då fungerar det i QA,
men jag får felmeddelandet Conversion overflows. När jag lägger in det via min websida. Och om jag skapar en View "SnittLista" så får jag följande meddelande:
Invalid object name 'resultat'. Invalid object name 'resultat'. Invalid object name 'resultat'. Invalid object name 'resultat'. Invalid object name 'resultat'. Invalid object name 'resultat'. Could not use view or function 'SnittLista' because of binding errors
GertSv: Expression i en underfråga SQL?
Borde vetat bätrre än att försöka något sånt här utan att testköra över huvud taget.
Vill du ha mer hjälp så posta tabeller och lite data.
annars.
Börja med följande, det lär funka bättre än föregående exempel.
SELECT TOP 100 PERCENT medlemmar.Namn
FROM medlemmar LEFT OUTER JOIN Resultat r ON medlemmar.ID = r.Spelare
LEFT OUTER JOIN Resultat h ON medlemmar.ID = h.Spelare
LEFT OUTER JOIN Resultat b ON medlemmar.ID = b.Spelare
WHERE h.H_B = 'H' AND
b.H_B = 'B'
GROUP BY medlemmar.Namn, medlemmar.ID
ORDER BY medlemmar.Namn DESC
Den borde väl i alla fall ramla igenom och så kan du fylla på tills det går snett.
i ditt fall hade det funkat att döpt om tabellerna till resultat r istället för bara resultat.
Tyvärr har jag ingen aning om varför du får de fel du får.
Kör du USE databas innan du kör CREATE VIEW ....?
//EDIT, Massa syntaxfel
FredrikSv:Expression i en underfråga SQL?
Principen är mycket enklare, och själv föredrar jag den här metoden i och med att man slipper en massa joins:
<CODE>
SELECT *, ROUND(SUM(Resultat) / SUM(Serier * 1.0), 2, 1) AS Snitt,
ROUND(SUM(ResultatHemma) / SUM(SerierHemma * 1.0), 2, 1) AS SnittHemma,
ROUND(SUM(ResultatBorta) / SUM(SerierBorta * 1.0), 2, 1) AS SnittBorta
FROM
(SELECT s.Namn, s.Id,
SUM(Resultat) Resultat, SUM(Serier) Serier, SUM(Poang) AS Poäng,
MAX(Resultat) AS [Bästa], MIN(Resultat) AS [Sämsta],
SUM(CASE WHEN H_B = 'H' THEN Resultat ELSE 0 END) ResultatHemma,
SUM(CASE WHEN H_B = 'H' THEN Serier ELSE 0 END) SerierHemma,
SUM(CASE WHEN H_B = 'H' THEN Poang ELSE 0 END) AS PoängHemma,
SUM(CASE WHEN H_B = 'B' THEN Resultat ELSE 0 END) ResultatBorta,
SUM(CASE WHEN H_B = 'B' THEN Serier ELSE 0 END) SerierBorta,
SUM(CASE WHEN H_B = 'B' THEN Poang ELSE 0 END) AS PoängBorta
FROM medlemmar s LEFT JOIN Resultat r
ON s.ID = r.Spelare
GROUP BY s.Namn, s.ID
) x
ORDER BY Snitt DESC
</CODE>
Komplettera själv med de fält jag inte orkat ta med.
/PelleSv: Expression i en underfråga SQL?
Provade din lösning i QA men får error:
Server: Msg 8118, Level 16, State 1, Line 1
Column 'X.Namn' is invalid in the select list because it is not contained in an aggregate function and there is no GROUP BY clause.
Tar jag bort det och försöker igen så får jag:
Server: Msg 156, Level 15, State 1, Line 18
Incorrect syntax near the keyword 'ORDER'.
Hur hade du tänkt dig?
God fortsättning
GertSv: Expression i en underfråga SQL?
Vet inte vad han menade med X?Sv: Expression i en underfråga SQL?
Fungerar när jag kör det i QA.
Men får Conversion overflows när jag använder den i den datagrid.
An unhandled exception was generated during the execution of the current web request. Information regarding the origin and location of the exception can be identified using the exception stack trace below.
/GertSv: Expression i en underfråga SQL?
Det löste inte problemet, utan blev ju bara ett Snitt av alla resultat / serier för alla spelare.
I min start fråga så är det 11 olika spelare med 11 olika snitt.Sv: Expression i en underfråga SQL?
ROUND(SUM(r.Resultat) / SUM(r.Serier * 1.0), 2, 1) AS Snitt,
eller
(SELECT ROUND(SUM(Resultat) / SUM(Serier * 1.0), 2, 1)
FROM resultat
WHERE Spelare = s.ID AND H_B = 'H') AS [Snitt hemma],
Query Builder omvandlar det till
SELECT TOP 100 PERCENT s.Namn, SUM(r.Serier) AS [Antal serier], ROUND(SUM(r.Resultat) / SUM(r.Serier * 1.0), 2, 1) AS Snitt, SUM(r.Poang) AS Poäng, SUM(r.Miss) AS Miss,
(SELECT SUM(Serier) AS serier
FROM Resultat
WHERE (Spelare = s.ID) AND (H_B = 'H')) AS [Serier hemma],
(SELECT ROUND(SUM(Resultat) / SUM(Serier * 1.0), 2, 1) AS Expr1
FROM Resultat AS Resultat_5
WHERE (Spelare = s.ID) AND (H_B = 'H')) AS [Snitt hemma],
(SELECT SUM(Poang) AS Expr1
FROM Resultat AS Resultat_4
WHERE (Spelare = s.ID) AND (H_B = 'H')) AS [Poäng Hemma],
(SELECT SUM(Serier) AS Expr1
FROM Resultat AS Resultat_3
WHERE (Spelare = s.ID) AND (H_B = 'B')) AS [Serier borta],
(SELECT ROUND(SUM(Resultat) / SUM(Serier * 1.0), 2, 1) AS Expr1
FROM Resultat AS Resultat_2
WHERE (Spelare = s.ID) AND (H_B = 'B')) AS [Snitt borta],
(SELECT SUM(Poang) AS Expr1
FROM Resultat AS Resultat_1
WHERE (Spelare = s.ID) AND (H_B = 'B')) AS [Poäng Borta], ROUND(SUM(r.Poang * 1.0) / SUM(r.Serier), 2) AS [P Snitt], MAX(r.Resultat) AS Bästa, MIN(r.Resultat) AS Sämsta
FROM medlemmar AS s INNER JOIN
Resultat AS r ON s.ID = r.Spelare
GROUP BY s.Namn, s.ID
Snitt, Snitt hemma och Snitt borta: Unable to read data
/Gert
Sv:Expression i en underfråga SQL?
Syntaxmässigt så tycker jag det är mer lättläst men då kommer jag från MySQL och är van att klara mig utan subquieries.
Posta tabeller och lite exempeldata så kan jag nog lova att någon klämmer den ganska snabbt men att någon ska skriva ett exempel här som funkar perfekt i qa på första försöket tror jag är att hoppas på för mycket.
FredrikSv: Expression i en underfråga SQL?
CREATE PROCEDURE Ubc_Totalt
@OmgangsVal Int
AS
SET NOCOUNT ON;
SELECT TOP 100 PERCENT s.Namn + ' ' + s.ENamn, SUM(r.Serier) AS [Antal serier], CAST(SUM(r.Resultat * 1.0) / SUM(r.Serier) AS Decimal(5 , 2)) AS Snitt, SUM(r.Poang) AS Poäng,
(SELECT SUM(Serier)
FROM resultat
WHERE Spelare = s.ID AND H_B = 'H') AS [Serier hemma],
(SELECT CAST(SUM(Resultat * 1.0) / SUM(Serier) AS Decimal(5, 2))
FROM resultat r
WHERE Spelare = s.ID AND H_B = 'H' )AS [Snitt Hemma],
(SELECT SUM(Poang)
FROM resultat
WHERE Spelare = s.ID AND H_B = 'H') AS [Poäng Hemma],
(SELECT SUM(Serier)
FROM resultat
WHERE Spelare = s.ID AND H_B = 'B') AS [Serier borta],
(SELECT CAST(SUM(Resultat * 1.0) / SUM(Serier) AS Decimal(5, 2))
FROM resultat
WHERE Spelare = s.ID AND H_B = 'B' )AS [Snitt Borta],
(SELECT SUM(Poang)
FROM resultat
WHERE Spelare = s.ID AND H_B = 'B') AS [Poäng Borta], CAST(SUM(r.Poang * 1.0) / SUM(r.Serier)AS Decimal(5, 2))AS [Poäng Snitt], MAX(r.Resultat) AS Bästa,
Min(Case When r.serier=4 then r.resultat else Null end) AS [Sämsta]
FROM tuser1316.medlemmar s INNER JOIN
tuser1316.Resultat r ON s.ID = r.Spelare
GROUP BY s.Namn + ' ' + s.ENamn, s.ID
ORDER BY ROUND(SUM(r.Resultat) / SUM(r.Serier * 1.0), 2, 1) DESC
GO
Sv:Expression i en underfråga SQL?
Kul att du löste det själv!
Felet med mitt förslag var att jag hade glömt en group by. Man måste gruppera på alla fält i sub-select:en. Så här skulle det vara:
<CODE>
SELECT *, ROUND(SUM(Resultat) / SUM(Serier * 1.0), 2, 1) AS Snitt,
ROUND(SUM(ResultatHemma) / SUM(SerierHemma * 1.0), 2, 1) AS SnittHemma,
ROUND(SUM(ResultatBorta) / SUM(SerierBorta * 1.0), 2, 1) AS SnittBorta
FROM
(SELECT s.Namn, s.Id,
SUM(Resultat) Resultat, SUM(Serier) Serier, SUM(Poang) AS Poäng,
MAX(Resultat) AS [Bästa], MIN(Resultat) AS [Sämsta],
SUM(CASE WHEN H_B = 'H' THEN Resultat ELSE 0 END) ResultatHemma,
SUM(CASE WHEN H_B = 'H' THEN Serier ELSE 0 END) SerierHemma,
SUM(CASE WHEN H_B = 'H' THEN Poang ELSE 0 END) AS PoängHemma,
SUM(CASE WHEN H_B = 'B' THEN Resultat ELSE 0 END) ResultatBorta,
SUM(CASE WHEN H_B = 'B' THEN Serier ELSE 0 END) SerierBorta,
SUM(CASE WHEN H_B = 'B' THEN Poang ELSE 0 END) AS PoängBorta
FROM medlemmar s LEFT JOIN Resultat r
ON s.ID = r.Spelare
GROUP BY s.Namn, s.ID
) x
GROUP BY x.Namn, x.Id, x.Resultat, x.Serier, x.Poäng, x.[Bästa], x.[Sämsta], x.ResultatHemma, x.SerierHemma, x.PoängHemma, x.ResultatBorta, x.SerierBorta, x.PoängBorta
ORDER BY Snitt DESC
</CODE>
Själv tycker jag att detta är en snyggare lösning.
/Pelle