Avatar billede testpilot_dk Nybegynder
24. maj 2007 - 11:59 Der 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
Avatar billede bennytordrup Nybegynder
24. maj 2007 - 12:02 #1
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
Avatar billede testpilot_dk Nybegynder
24. maj 2007 - 13:24 #2
Jeg takker for svaret, er det muligt at få dem ved siden af hinanden, sådan at header er Status0 og Status1TO8 og Over, så der kun er en række ?

Håber du forstår
Avatar billede bennytordrup Nybegynder
24. maj 2007 - 13:35 #3
Ikke uden at skulle pakke det ind i op til to nested SQL
Avatar billede testpilot_dk Nybegynder
24. maj 2007 - 13:46 #4
Hmm.
  Hvordan gør jeg så det helt præcist!

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 ???

    RETURN    
END   
GO
Avatar billede bennytordrup Nybegynder
24. maj 2007 - 13:59 #5
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
            )
Avatar billede testpilot_dk Nybegynder
24. maj 2007 - 14:11 #6
Hmm, den giver Incorrect Syntax ved den sidste parantes.
Avatar billede bennytordrup Nybegynder
24. maj 2007 - 14:26 #7
Tilføj et X efter.
Avatar billede testpilot_dk Nybegynder
24. maj 2007 - 14:50 #8
Hej Benny!

  Jeg vil ikke forstyrre dig mere, jeg takker mange gange for det gode svar.
Avatar billede kjulius Novice
24. maj 2007 - 20:52 #9
Det bør da kunne forenkles lidt, ville jeg tro:

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.
Avatar billede kjulius Novice
24. maj 2007 - 20:54 #10
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)
Avatar billede kjulius Novice
24. maj 2007 - 20:56 #11
Arghh!! Mangler stadig en højre parantes:

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!)
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