24. maj 2007 - 11:59Der er
10 kommentarer og 1 løsning
Group by og intervaller
Hej!
Jeg har en sql database, hvor jeg trækker forskellige data ud fra, disse data ønsker jeg at få grupperet i forskellige intervaller.
Min SQL sætning ser således ud nu og gruppere ikke i de ønskede intervaller.
SELECT COUNT(*) AS StatusCount, Customer.Status FROM CustomerEmployee INNER JOIN Customer ON CustomerEmployee.CustomerID = Customer.ID WHERE (CustomerEmployee.EmployeeID = 2388) GROUP BY Customer.Status
Mit resultat er
StatusCount Status 407 0 3 3 124 6
Jeg ønsker at gruppere dem sådan at hvis status er 0 skal det være et resultat, hvis den er mellem 1 og 8 skal den lave et nyt resutltat og over 8 et tredje
select Count(*) as StatusCount, case when Customer.Status = 0 then 'Status: 0' when Customer.Status between 1 and 8 then 'Status: 1 til 8' else 'Status: Over 8 end from CustomerEmployee inner join Custoemr on CustomerEmployee.CustomerID = Customer.ID where (CustomerEmployee.EmployeeID = 2388) group by case when Customer.Status = 0 then 'Status: 0' when Customer.Status between 1 and 8 then 'Status: 1 til 8' else 'Status: Over 8 end
Sidder og leger med functioner og sådan! Hvis man gerne vil have returnet en tabel med resultater fra flere sql sætninger, hvordan får jeg dem så sat ind smart.
Min funktion ser således ud indtil nu, derfor ville jeg gerne have dem stående på den anden måde
ALTER FUNCTION dbo.GetDetailsForReport (@ParentID AS int) RETURNS @resulting TABLE ( EmployeeID int not null, EmployeeName varchar(50) null, TotalVisist int null Status0 int null, Status1To8 int null, StatusOver int null ) AS BEGIN
INSERT INTO @resulting SELECT Employee.ID, Employee.Name From Employee WHERE ParentID = @ParentID ' Flere SQL sætninger her, men hvordan ???
select sum(case StatusCode when 'Status: 0' then StatusCount else 0 end) as Status0, sum(case StatusCode when 'Status: 1 til 8' then StatusCount else 0 end) as Status1To8, sum(case StatusCode when 'Status: Over 8' then StatusCount else 0 end) as StatusOver from ( select Count(*) as StatusCount, case when Customer.Status = 0 then 'Status: 0' when Customer.Status between 1 and 8 then 'Status: 1 til 8' else 'Status: Over 8' end as StatusCode from CustomerEmployee inner join Custoemr on CustomerEmployee.CustomerID = Customer.ID where (CustomerEmployee.EmployeeID = 2388) group by case when Customer.Status = 0 then 'Status: 0' when Customer.Status between 1 and 8 then 'Status: 1 til 8' else 'Status: Over 8' end )
SELECT SUM(CASE WHEN c.Status = 0 THEN 1 ELSE 0 END) AS Status0, SUM(CASE WHEN c.Status BETWEEN 1 AND 8 THEN 1 ELSE 0 END) AS Status1to8, SUM(CASE WHEN c.Status > 8 THEN StatusOver8 FROM CustomerEmployee ce INNER JOIN Customer c ON ce.CustomerID = c.ID WHERE (ce.EmployeeID = 2388)
Da group by er baseret på en case konstruktion vil forespørgslen sandsynligvis ikke kunne bruge et evt. index alligevel, så der burde ikke være nogen forskel i eksekveringshastigheden.
Skulle naturligvis have været (fik trykket lidt for tidligt)
SELECT SUM(CASE WHEN c.Status = 0 THEN 1 ELSE 0 END) AS Status0, SUM(CASE WHEN c.Status BETWEEN 1 AND 8 THEN 1 ELSE 0 END) AS Status1to8, SUM(CASE WHEN c.Status > 8 THEN 1 ELSE 0 END AS StatusOver8 FROM CustomerEmployee ce INNER JOIN Customer c ON ce.CustomerID = c.ID WHERE (ce.EmployeeID = 2388)
SELECT SUM(CASE WHEN c.Status = 0 THEN 1 ELSE 0 END) AS Status0, SUM(CASE WHEN c.Status BETWEEN 1 AND 8 THEN 1 ELSE 0 END) AS Status1to8, SUM(CASE WHEN c.Status > 8 THEN 1 ELSE 0 END) AS StatusOver8 FROM CustomerEmployee ce INNER JOIN Customer c ON ce.CustomerID = c.ID WHERE (ce.EmployeeID = 2388)
(Jeg skulle nok ikke have blandet mig og holdt fingrene fra tastaturet!)
Synes godt om
Ny brugerNybegynder
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.