Avatar billede Nicolai Nybegynder
05. juli 2011 - 14:14 Der er 8 kommentarer og
1 løsning

Hjælp til SQL Streng

Hej,

Når jeg kører nedenstående kommer det rigtig fint ud så længe at Omsaetning eller Outlook har/får en værdi. Men hvis jeg nu ønsker at alle tblNordicOrderBoard.QBS skal fremgå af mit output med med Omsaetning og Outlook som 0 værdi selvom der ikke er nogen sum/min, hvad går jeg så?

Jeg har prøvet med lidt SELECT CASE WHEN, men uden held.

Jeg er kørt helt fast...

Hjææælp :)


SELECT
  dbo.tblNordicOrderBoard.QBS,
  CONVERT(varchar(15), CONVERT(money, SUM(dbo.tblNordicOrderBoard.REVENUE), 1), 1) AS Omsaetning,
  CONVERT(varchar(15), CONVERT(money, MIN(dbo.tblOutlookLA.Outlook), 1), 1) AS Outlook
FROM
  dbo.tblNordicOrderBoard,
  dbo.tblOutlookLA
WHERE
  dbo.tblNordicOrderBoard.COUNTRY = 'DK' AND
  dbo.tblNordicOrderBoard.UNIT = 'LA' AND
  dbo.tblNordicOrderBoard.QBS = dbo.tblOutlookLA.QBS AND
  dbo.tblNordicOrderBoard.COMMENT = 'Standard' AND
  datepart(month, dbo.tblNordicOrderBoard.Time) = datepart(month, getdate()) AND
  dbo.tblOutlookLA.MONTH = datepart(month, getdate())
GROUP BY
  dbo.tblNordicOrderBoard.QBS
ORDER BY
  MIN(dbo.tblOutlookLA.Outlook) DESC,
  SUM(dbo.tblNordicOrderBoard.REVENUE) DESC
Avatar billede jedc Nybegynder
05. juli 2011 - 14:44 #1
Nu kan jeg ikke se dit data grundlag, men som jeg ser det, er der 2 ting der kan "ødelægge" din resultat.

Formoder det er en SQL Server du arbejder på

Din Join imellem tblNordicOrderBoard og tblOutlookLA skal være et outer join, så du tager alle med fra tblNordicOrderBoard selvom der ikke er nogle hit på tblOutlookLA

Udover det hvis tblNordicOrderBoard.REVENUE og tblOutlookLA.Outlook er NULL, så skal du erstatte dine Null med 0 i din select

du kan evt bruge isnull til det se http://msdn.microsoft.com/en-us/library/ms184325.aspx

så det bliver noget ala (kender ikke dine tabeller og data type, så dette er bare et gæt)

SELECT
  dbo.tblNordicOrderBoard.QBS,
  CONVERT(varchar(15), CONVERT(money, SUM(isnull(dbo.tblNordicOrderBoard.REVENUE,0)), 1), 1) AS Omsaetning,
  CONVERT(varchar(15), CONVERT(money, MIN(isnull(dbo.tblOutlookLA.Outlook)), 1), 1) AS Outlook
FROM
  dbo.tblNordicOrderBoard LEFT OUTER JOIN dbo.tblOutlookLA on dbo.tblNordicOrderBoard.QBS = dbo.tblOutlookLA.QBS
WHERE
  dbo.tblNordicOrderBoard.COUNTRY = 'DK' AND
  dbo.tblNordicOrderBoard.UNIT = 'LA' AND
  dbo.tblNordicOrderBoard.COMMENT = 'Standard' AND
  /* Hvad med året, du sammenligner kun på måned
  Kunne laves ala hvis felterne er dato (Quick and Dirty)
 
  Month(dbo.tblNordicOrderBoard.Time) = Month(GetDate()) and
  Month(dbo.tblOutlookLA) = Month(GetDate()) and
  Year(dbo.tblNordicOrderBoard.Time)= =Year(GetDate()) and
  Year(dbo.tblOutlookLA)= =Year(GetDate()) and
  */
  datepart(month, dbo.tblNordicOrderBoard.Time) = datepart(month, getdate()) AND
  dbo.tblOutlookLA.MONTH = datepart(month, getdate())
  /**/
GROUP BY
  dbo.tblNordicOrderBoard.QBS
ORDER BY
  MIN(dbo.tblOutlookLA.Outlook) DESC,
  SUM(dbo.tblNordicOrderBoard.REVENUE) DESC
Avatar billede Nicolai Nybegynder
06. juli 2011 - 08:42 #2
Tusind tak for et super hurtigt svar. Jeg har prøvet dit svar af en i query builder, men den fejler og siger "The isnull function requires 2 arguments."

Jeg kigger selv lige på det link du sendte mig, men hvis du kan hjælpe yderligere ville det være super... :)
Avatar billede Nicolai Nybegynder
06. juli 2011 - 08:54 #3
Nu fik jeg rettet det til - det var vist lidt med nogle paranetser :). Men output fra query indeholder stadig kun dem der har værdier i dbo.tblNordicOrderBoard.REVENUE?? Så jeg får lige nu stadig kun to rows i output, selvom jeg har mere end 15 rows i dbo.tblNordicOrderBoard.QBS?

Koden jeg bruger nu:

SELECT
  dbo.tblNordicOrderBoard.QBS,
  CONVERT(varchar(15), CONVERT(money, SUM(isnull(dbo.tblNordicOrderBoard.REVENUE, 0)), 1), 1) AS Omsaetning,
  CONVERT(varchar(15), CONVERT(money, MIN(isnull(dbo.tblOutlookLA.Outlook, 0)), 1), 1) AS Outlook
FROM
  dbo.tblNordicOrderBoard LEFT OUTER JOIN dbo.tblOutlookLA on dbo.tblNordicOrderBoard.QBS = dbo.tblOutlookLA.QBS
WHERE
  dbo.tblNordicOrderBoard.COUNTRY = 'DK' AND
  dbo.tblNordicOrderBoard.UNIT = 'LA' AND
  dbo.tblNordicOrderBoard.COMMENT = 'Standard' AND
  datepart(month, dbo.tblNordicOrderBoard.Time) = datepart(month, getdate()) AND
  dbo.tblOutlookLA.MONTH = datepart(month, getdate())
GROUP BY
  dbo.tblNordicOrderBoard.QBS
ORDER BY
  MIN(dbo.tblOutlookLA.Outlook) DESC,
  SUM(dbo.tblNordicOrderBoard.REVENUE) DESC
Avatar billede jedc Nybegynder
06. juli 2011 - 09:33 #4
hmm kan være din join og where der driller

prøv lige, eller send mig lige dine create på tabellerne

SELECT
  dbo.tblNordicOrderBoard.QBS,
  CONVERT(varchar(15), CONVERT(money, SUM(isnull(dbo.tblNordicOrderBoard.REVENUE, 0)), 1), 1) AS Omsaetning,
  CONVERT(varchar(15), CONVERT(money, MIN(isnull(dbo.tblOutlookLA.Outlook, 0)), 1), 1) AS Outlook
FROM
  dbo.tblNordicOrderBoard LEFT OUTER JOIN dbo.tblOutlookLA on (dbo.tblNordicOrderBoard.QBS = dbo.tblOutlookLA.QBS and dbo.tblOutlookLA.MONTH = datepart(month, getdate()))
WHERE
  dbo.tblNordicOrderBoard.COUNTRY = 'DK' AND
  dbo.tblNordicOrderBoard.UNIT = 'LA' AND
  dbo.tblNordicOrderBoard.COMMENT = 'Standard' AND
  datepart(month, dbo.tblNordicOrderBoard.Time) = datepart(month, getdate())
GROUP BY
  dbo.tblNordicOrderBoard.QBS
ORDER BY 3 desc, 2 desc
Avatar billede Nicolai Nybegynder
06. juli 2011 - 09:59 #5
Dit nye forslag giver stadig kun 2 rows.

Her er Create på tabellerne:

CREATE TABLE [dbo].[tblNordicOrderBoard] (
  [ID] int IDENTITY(1, 1) NOT NULL,
  [COUNTRY] nvarchar(20) COLLATE Latin1_General_CI_AS NULL,
  [COUNTRYFLAG] nvarchar(50) COLLATE Latin1_General_CI_AS NULL,
  [UNIT] varchar(4) COLLATE Latin1_General_CI_AS NULL,
  [QBS] nvarchar(100) COLLATE Latin1_General_CI_AS NULL,
  [CUSTOMER] nvarchar(100) COLLATE Latin1_General_CI_AS NULL,
  [PRODUCTS] nvarchar(200) COLLATE Latin1_General_CI_AS NULL,
  [COMMENT] nvarchar(200) COLLATE Latin1_General_CI_AS NULL,
  [TYPE] nvarchar(3) COLLATE Latin1_General_CI_AS NULL,
  [REVENUE] numeric(20, 0) NULL,
  [TIME] datetime NULL,
  CONSTRAINT [PK__tblNordicOrderBo__1EA48E88] PRIMARY KEY CLUSTERED ([ID])
)
ON [PRIMARY]
GO

CREATE TABLE [dbo].[tblOutlookLA] (
  [QBS] nvarchar(60) COLLATE Latin1_General_CI_AS NULL,
  [MONTH] nvarchar(60) COLLATE Latin1_General_CI_AS NULL,
  [OUTLOOK] numeric(25, 0) NULL,
  UNIQUE ([QBS])
)
ON [PRIMARY]
GO
Avatar billede Nicolai Nybegynder
06. juli 2011 - 14:39 #6
Måske at det er denne her i WHERE der driller:


datepart(month, dbo.tblNordicOrderBoard.Time) = datepart(month, getdate())

Fordi hvis der ikke findes post i tblNordicOrderBoard der er i indeværende måned, så vil denne ikke vises. Eller er det helt forkert?
Avatar billede jedc Nybegynder
06. juli 2011 - 20:13 #7
dette burde virke, men som sagt i den forrige post, så får du kun de linier udfra  dbo.tblNordicOrderBoard, der rammer kravende i din Where sætning.
SELECT
  dbo.tblNordicOrderBoard.QBS,
  CONVERT(varchar(15), CONVERT(money, SUM(isnull(dbo.tblNordicOrderBoard.REVENUE, 0)), 1), 1) AS Omsaetning,
  CONVERT(varchar(15), CONVERT(money, MIN(isnull(dbo.tblOutlookLA.Outlook, 0)), 1), 1) AS Outlook

FROM
  dbo.tblNordicOrderBoard LEFT OUTER JOIN dbo.tblOutlookLA on (dbo.tblNordicOrderBoard.QBS = dbo.tblOutlookLA.QBS and dbo.tblOutlookLA.MONTH = month(getdate())
  )
WHERE
  dbo.tblNordicOrderBoard.COUNTRY = 'DK' AND
  dbo.tblNordicOrderBoard.UNIT = 'LA' AND
  dbo.tblNordicOrderBoard.COMMENT = 'Standard' AND
  month(dbo.tblNordicOrderBoard.Time) = month(getdate())

GROUP BY
  dbo.tblNordicOrderBoard.QBS
ORDER BY 3 desc, 2 desc
Avatar billede Nicolai Nybegynder
07. juli 2011 - 08:31 #8
Jeg takker mange gange for din hjælp. Det resultat jeg får er desværre stadig det samme som den oprindelige query. Og som du skriver skyldes det nok WHERE sætningen som hedder:

month(dbo.tblNordicOrderBoard.Time) = month(getdate())

Fordi hvis der ikke er nogen rows i NordicOrderBoard der opfylder det kriterie så sortere den den pågældende NordicOrderBoard.QBS fra upåagtet at der på denne .QBS findes en værdi i dbo.tblOutlookLA.Outlook.

Hvis jeg fjerner den WHERE del, så kommer alle .QBS frem og det er det rigtige .Outlook der står der, men der står nu den samlede .REVENUE fra hele året i og med der WHERE ikke længere begrænser til måneden...
Avatar billede Nicolai Nybegynder
19. oktober 2012 - 09:47 #9
Lukketid
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