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


Expression i en underfråga SQL?

Postades av 2005-12-19 18:32:01 - Gert Lindholm, i forum sql-server/msde, Tråden har 14 Kommentarer och lästs av 1038 personer

Hej jag har en ganska klurig SQL fråga och vill nu lägga in en kolumn till som en underfråga.

 (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


Svara

Sv: Expression i en underfråga SQL?

Postades av 2005-12-21 17:19:35 - Fredrik Högberg

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 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.

Fredrik


Svara

Sv:Expression i en underfråga SQL?

Postades av 2005-12-21 19:22:32 - Gert Lindholm

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.
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



Gert


Svara

Sv: Expression i en underfråga SQL?

Postades av 2005-12-22 08:41:32 - Fredrik Högberg

Svårt att hitta syntaxfel i forumet.
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

Fredrik


Svara

Sv:Expression i en underfråga SQL?

Postades av 2005-12-22 22:23:30 - Per Karlsson

Här kommer ytterligare ett sätt att lösa problemet.
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.

/Pelle


Svara

Sv: Expression i en underfråga SQL?

Postades av 2005-12-27 22:05:04 - Gert Lindholm

Hej Pelle,

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
Gert


Svara

Sv:Expression i en underfråga SQL?

Postades av 2005-12-27 22:40:21 - Mikael Wedham

Det verkar som du skrivit x.namn istället för s.namn

/micke


Svara

Sv: Expression i en underfråga SQL?

Postades av 2005-12-27 22:46:59 - Gert Lindholm

Klippte in det som Pelle hade gett som förslag.
Vet inte vad han menade med X?



Svara

Sv:Expression i en underfråga SQL?

Postades av 2005-12-28 19:02:02 - Mikael Wedham

Du skall inte ha en * först i frågan...

/micke


Svara

Sv: Expression i en underfråga SQL?

Postades av 2005-12-28 21:23:08 - Gert Lindholm

Det kan jag köpa, men vad står x för i slutet?
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.

/Gert


Svara

Sv: Expression i en underfråga SQL?

Postades av 2005-12-28 21:58:47 - Gert Lindholm

Hej Pelle!

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.


Svara

Sv: Expression i en underfråga SQL?

Postades av 2005-12-28 22:08:49 - Gert Lindholm

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:

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


Svara

Sv:Expression i en underfråga SQL?

Postades av 2005-12-30 23:34:21 - Fredrik Högberg

Testade du med JOIN istället?
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.

Fredrik


Svara

Sv: Expression i en underfråga SQL?

Postades av 2006-01-13 00:36:09 - Gert Lindholm

Nu har jag löst det så här kan det vara....


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


Svara

Sv:Expression i en underfråga SQL?

Postades av 2006-01-21 15:33:18 - Per Karlsson

Nu är jag tillbaka, har inte varit inne här på ett tag.
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


Svara

Nyligen

  • 14:24 CBD regelbundet?
  • 14:23 CBD regelbundet?
  • 14:22 Har du märkt några verkliga fördel
  • 09:09 Vill du köpa medicinska tester?
  • 12:47 Vem beviljar assistansen – kommune
  • 14:17 Någon med erfarenhet av hemstädnin
  • 14:14 Bör man använda sig av en båtförme
  • 14:12 Finns det någon intressant hundblo

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 569 619
27 953
271 709
5 739
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