Avatar billede larsomania Nybegynder
27. september 2002 - 09:56 Der er 6 kommentarer og
1 løsning

Fylde record fra to forskellige selects

Hejsa,

Jeg sidder og arbejder med et lille task, der skal beregne to værdier og indsætte dem i to forskellige felter i samme record. Kan man det?

For at illustere har jeg her to SQL statements, der indsætter den relevante værdi i to seperate records:

INSERT INTO [RepHotels] (Country, NumberOfDTP, CreationDate)
SELECT
  DestCountry, Count (*), (getdate())

FROM
  TMS.dbo.ORDERREP,
  TMS.dbo.Htlinf,
  TMS.dbo.Htlprice
WHERE
  ( TMS.dbo.ORDERREP.Htlno=TMS.dbo.Htlinf.Htlnr  )
  AND  ( TMS.dbo.Htlinf.Htlnr=TMS.dbo.Htlprice.Htlno  )
  AND  ( TMS.dbo.ORDERREP.Carcomp=TMS.dbo.Htlprice.Code  )
  AND  ( TMS.dbo.ORDERREP.Depdate between TMS.dbo.Htlprice.Fromdate and TMS.dbo.Htlprice.Todate  )
  AND  (
  TMS.dbo.ORDERREP.Invdate >= '09-01-2002'
  AND  TMS.dbo.ORDERREP.Art  =  'H'
  AND  TMS.dbo.ORDERREP.Destcountry = 'DK'
  AND  TMS.dbo.Htlinf.CustRef = 'DTP'
  )
GROUP BY
  DestCountry

GO

INSERT INTO [RepHotels] (Country, NumberOfOther, CreationDate)
SELECT
  DestCountry, Count (*), (getdate())

FROM
  TMS.dbo.ORDERREP

WHERE
  (
  TMS.dbo.ORDERREP.Invdate >= '09-01-2002'
  AND  TMS.dbo.ORDERREP.Art  =  'H'
  AND  TMS.dbo.ORDERREP.Destcountry = 'DK'
  )
GROUP BY
  DestCountry

GO
Avatar billede bennytordrup Nybegynder
27. september 2002 - 10:10 #1
INSERT INTO [RepHotels] (Country, NumberOfDTP, NumberOfOther CreationDate)
select DestCountry, sum(noDTP), Sum(noOther ), getdate()
from (
SELECT
  DestCountry, Count (*) as noDTP, 0 as noOther,

FROM
  TMS.dbo.ORDERREP,
  TMS.dbo.Htlinf,
  TMS.dbo.Htlprice
WHERE
  ( TMS.dbo.ORDERREP.Htlno=TMS.dbo.Htlinf.Htlnr  )
  AND  ( TMS.dbo.Htlinf.Htlnr=TMS.dbo.Htlprice.Htlno  )
  AND  ( TMS.dbo.ORDERREP.Carcomp=TMS.dbo.Htlprice.Code  )
  AND  ( TMS.dbo.ORDERREP.Depdate between TMS.dbo.Htlprice.Fromdate and TMS.dbo.Htlprice.Todate  )
  AND  (
  TMS.dbo.ORDERREP.Invdate >= '09-01-2002'
  AND  TMS.dbo.ORDERREP.Art  =  'H'
  AND  TMS.dbo.ORDERREP.Destcountry = 'DK'
  AND  TMS.dbo.Htlinf.CustRef = 'DTP'
  )
GROUP BY
  DestCountry

union

SELECT
  DestCountry, 0 as noDTP, Count (*) as noOther)

FROM
  TMS.dbo.ORDERREP

WHERE
  (
  TMS.dbo.ORDERREP.Invdate >= '09-01-2002'
  AND  TMS.dbo.ORDERREP.Art  =  'H'
  AND  TMS.dbo.ORDERREP.Destcountry = 'DK'
  )
GROUP BY
  DestCountry
) x
Avatar billede larsomania Nybegynder
27. september 2002 - 10:21 #2
Hmm.. Virker - næsten:

INSERT INTO [RepHotels] (Country, NumberOfDTP, NumberOfOther, CreationDate)
SELECT DestCountry, sum(noDTP), Sum(noOther ), getdate()
FROM (

SELECT
  DestCountry, Count (*) as noDTP, 0 as noOther

FROM
  TMS.dbo.ORDERREP,
  TMS.dbo.Htlinf,
  TMS.dbo.Htlprice
WHERE
  ( TMS.dbo.ORDERREP.Htlno=TMS.dbo.Htlinf.Htlnr  )
  AND  ( TMS.dbo.Htlinf.Htlnr=TMS.dbo.Htlprice.Htlno  )
  AND  ( TMS.dbo.ORDERREP.Carcomp=TMS.dbo.Htlprice.Code  )
  AND  ( TMS.dbo.ORDERREP.Depdate between TMS.dbo.Htlprice.Fromdate and TMS.dbo.Htlprice.Todate  )
  AND  (
  TMS.dbo.ORDERREP.Invdate >= '09-01-2002'
  AND  TMS.dbo.ORDERREP.Art  =  'H'
  AND  TMS.dbo.ORDERREP.Destcountry = 'DK'
  AND  TMS.dbo.Htlinf.CustRef = 'DTP'
  )
GROUP BY
  DestCountry

UNION

SELECT
  DestCountry, 0 as noDTP, Count (*) as noOther

FROM
  TMS.dbo.ORDERREP

WHERE
  (
  TMS.dbo.ORDERREP.Invdate >= '09-01-2002'
  AND  TMS.dbo.ORDERREP.Art  =  'H'
  AND  TMS.dbo.ORDERREP.Destcountry = 'DK'
  )
GROUP BY
  DestCountry
)


Giver

Server: Msg 170, Level 15, State 1, Line 42
Line 42: Incorrect syntax near ')'.

Hvor linje 42 er den sidste ')' nederst. Men det matcher jo korrekt nok starte parantesen lige før den første SELECT...
Avatar billede bennytordrup Nybegynder
27. september 2002 - 10:23 #3
Du glemte det x, der står efter sidste parantes. Det SKAL med.
Avatar billede larsomania Nybegynder
27. september 2002 - 10:32 #4
Hvad gør x'et?

Nu har jeg -

INSERT INTO [RepHotels] (Country, NumberOfDTP, NumberOfOther, CreationDate)
SELECT DestCountry, sum(noDTP), Sum(noOther ), getdate()
FROM (

SELECT
  DestCountry, Count (*) as noDTP, 0 as noOther

FROM
  TMS.dbo.ORDERREP,
  TMS.dbo.Htlinf,
  TMS.dbo.Htlprice
WHERE
  ( TMS.dbo.ORDERREP.Htlno=TMS.dbo.Htlinf.Htlnr  )
  AND  ( TMS.dbo.Htlinf.Htlnr=TMS.dbo.Htlprice.Htlno  )
  AND  ( TMS.dbo.ORDERREP.Carcomp=TMS.dbo.Htlprice.Code  )
  AND  ( TMS.dbo.ORDERREP.Depdate between TMS.dbo.Htlprice.Fromdate and TMS.dbo.Htlprice.Todate  )
  AND  (
  TMS.dbo.ORDERREP.Invdate >= '09-01-2002'
  AND  TMS.dbo.ORDERREP.Art  =  'H'
  AND  TMS.dbo.ORDERREP.Destcountry = 'DK'
  AND  TMS.dbo.Htlinf.CustRef = 'DTP'
  )
GROUP BY
  DestCountry

UNION

SELECT
  DestCountry, 0 as noDTP, Count (*) as noOther

FROM
  TMS.dbo.ORDERREP

WHERE
  (
  TMS.dbo.ORDERREP.Invdate >= '09-01-2002'
  AND  TMS.dbo.ORDERREP.Art  =  'H'
  AND  TMS.dbo.ORDERREP.Destcountry = 'DK'
  )
GROUP BY
  DestCountry
) x

og får

Server: Msg 8118, Level 16, State 1, Line 1
Column 'x.DestCountry' is invalid in the select list because it is not contained in an aggregate function and there is no GROUP BY clause.
Avatar billede bennytordrup Nybegynder
27. september 2002 - 10:34 #5
tilføj lige en ekstra GROUP BY DescCountry efter x
Avatar billede larsomania Nybegynder
27. september 2002 - 10:42 #6
Sådan.. Tak.. Det X - hvilken betydning har det?
Avatar billede bennytordrup Nybegynder
27. september 2002 - 10:44 #7
Det laver et alias på den select, der står inden i paranteserne. SQL Server kan ikke finde ud af syntaxen, hvis det alias ikke er der.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Computerworld tilbyder specialiserede kurser i database-management

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester