Avatar billede pluth Nybegynder
04. november 2010 - 18:37 Der er 9 kommentarer og
1 løsning

where problem

Hej,

Jeg har denne kode, som jeg har fået hjælp til her tidligere. Nu skal jeg have den udvidet lidt, og det kan jeg ikke få til at virke. Håber der er en som kan hjælpe ?

WITH CTE AS (
SELECT
*,
NTILE(14) OVER(ORDER BY id) AS Gruppe
FROM Posteringer
), CTE2 AS (
SELECT
Gruppe,
COUNT(*) AS TotalAntal,
(SELECT COUNT(*) FROM cte t2 WHERE t2.ErIndbetaling = 1 AND t1.Gruppe = t2.Gruppe)*1.0 AS AntalIndbetalinger,
CAST(CAST((SELECT COUNT(*)*1.0 FROM CTE t2 WHERE t2.ErIndbetaling = 1 AND t1.Gruppe = t2.Gruppe)/COUNT(*)*100 AS decimal(3,1)) AS VARCHAR(10)) + '%' AS ProcentSats
FROM cte t1
GROUP BY Gruppe
)
SELECT SUBSTRING(
(SELECT ',' + CAST((ProcentSats) AS VARCHAR(1000)) FROM cte2
FOR XML PATH('')),2,200000) AS CSV

Skal jeg have ændret til, så når den deler i de 14 dele, så skal den kun kigge på de rækker som f.eks. har C_id = '1'

Jeg har prøvet at sætte den sådan

SELECT
*,
NTILE(14) OVER(ORDER BY id) AS Gruppe
FROM Posteringer where C_id = '1', men det giver en SQL fejl.

Nogen som har et bedre bud ?
Avatar billede HenrikSjang Nybegynder
04. november 2010 - 19:01 #1
Det burde godt kunne virke det du skriver der. Er det en syntax-fejl du får?

Du bør kunne tilføje din where-klause 2 steder. Enten der hvor du har gjort det i eksemplet, eller til sidst sådan her:

...VARCHAR(1000)) FROM cte2
WHERE C_id = '1'

Resultatet vil være forskelligt. Hvis du sætter where klausen øverst, vil den først bortfiltrere alle andre rækker end der hvor C_id = '1', og dernæst dele resten i 14 chunks.
Ved at flytte where klausulen til sidst, vil den først dele alle rækker op i 14, og dernæst bortfiltrere de uønskede. Så her kan du godt risikere at nogle af de 14 chunks er tomme, hvor andre er fyldte.

Hvad er datatypen på C_id kolonnen? Hvis det er INT, så skal du blot skrive:
WHERE C_id = 1
..altså uden pling'erne.
Avatar billede pluth Nybegynder
04. november 2010 - 19:46 #2
Fejlen der kommer er

Msg 8115, Level 16, State 8, Line 1
Arithmetic overflow error converting numeric to data type numeric.
Avatar billede pluth Nybegynder
04. november 2010 - 19:49 #3
Hele min SQL er

WITH CTE AS (SELECT *, NTILE(14) OVER(ORDER BY id) AS Gruppe FROM posteringer where c_id = '1'), CTE2 AS (SELECT Gruppe, COUNT(*) AS TotalAntal , (SELECT COUNT(*) FROM cte t2 WHERE c_id = '1' AND t1.Gruppe = t2.Gruppe)*1.0 AS AntalIndbetalinger, CAST(CAST((SELECT COUNT(*)*1.0 FROM CTE t2 WHERE c_id = '1' AND t1.Gruppe = t2.Gruppe)/COUNT(*)*100 AS decimal(2,0)) AS VARCHAR(10)) AS ProcentSats
FROM cte t1  GROUP BY Gruppe) SELECT SUBSTRING((SELECT ',' + CAST((ProcentSats) AS VARCHAR(1000)) FROM cte2 FOR XML PATH('')),2,200000) AS CSV
Avatar billede MNS Nybegynder
04. november 2010 - 20:09 #4
Hej
Jeg tror at i din kode (where C_id = '1')dette et tal skal ikke stå i citate .På den måde melder det fejl .
Avatar billede pluth Nybegynder
04. november 2010 - 20:15 #5
Hvis jeg fjerner '' melder den denne fejl

Msg 102, Level 15, State 1, Line 1
Incorrect syntax near '1'.
Avatar billede HenrikSjang Nybegynder
04. november 2010 - 20:43 #6
Prøv at ændre decimal(3,1) til decimal(10,1)

Hvis resultaten af procentudregningen giver 100,0, vil decimal(3,1) ikke være nok. Prøv at ændre det til de (10,1), og se hvad output du får. Hvis du får værdier der er højere end 100, så er der noget andet galt.
Avatar billede pluth Nybegynder
04. november 2010 - 20:48 #7
Hej Sjang,

Jeg får præcis 100 hver gang, det er lidt underligt, men det må jeg kigge nærmere på.

Tak for hjælpen :)
Avatar billede pluth Nybegynder
11. november 2010 - 16:59 #8
Hej Sjang,

Jeg fik fundet årsagen, så du må lige smide et svar.

Måske kan du give mig et svar på, om jeg ud fra din SQL ovenfor, kan akkumulere den op pr. periode. Altså så hvis periode 1 har 10% indbetalinger og peirode 2 har 5% indbetalinger og hver periode er på 100 posteringer. Så bliver det akkumulerede 10%, 7,5%. 10/100=10% og 15/200= 7,5%. Indbetalinger/postering.
Avatar billede pluth Nybegynder
13. december 2010 - 07:15 #9
Sjamg vil du svare ?
Avatar billede pluth Nybegynder
27. december 2010 - 08:13 #10
Jeg lukker det selv
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