04. november 2010 - 18:37Der 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.
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.
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
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.
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.
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.