2013-05-05 16 views
8

Mam następujące kwerendy T-SQL:Group By Alias ​​name

select 
    count(CaseId), 
    (SELECT DATEDIFF(day,CreateDate,LastActivityDate)) AS DiffDate 
from 
    VW_Case_Analysis 
where 
    CaseStatus = 'C' 
    and LastActivityDate between '2013-4-1 00:00:00.000' and '2013-4-30 23:59:59.000' 
Group By 
    DiffDate 

otrzymuję następujący błąd:

Msg 207, Level 16, State 1, Line 15
Invalid column name 'DiffDate'.

Ideą tego zapytania jest to, że chcę, aby uzyskać liczbę sprawy rozwiązane (zamknięte) w ciągu wielu dni.

przykład:

dni

1 = 3 przypadki

2 = 50 przypadków

3 = 20 przypadków

jak można to osiągnąć?

+0

To pomaga, jeśli dał nam strukturę tabeli. – acdcjunior

Odpowiedz

18

Musisz użyć całego wyrażenia w klauzuli GROUP BY lub po prostu zawinąć całą instrukcję w podzapytanie i dokonać grupowania na zewnętrznej instrukcji.

Powodem dlaczego nie można używać ALIAS na GROUP BY punkcie, który jest tworzony na tym samym poziomie rachunku SELECT dlatego, że GROUP BY jest wykonywany przed SELECT klauzuli, w której ALIAS jest tworzony.

To SQL Order of Operation:

  • FROM
  • WHERE
  • klauzula GROUP BY
  • HAVING
  • klauzuli SELECT
  • klauzula ORDER BY

Wypróbuj to zapytanie,

SELECT COUNT(CaseId), 
     DiffDate 
FROM 
     (
      select CaseId, 
        DATEDIFF(day,CreateDate,LastActivityDate) AS DiffDate 
      from VW_Case_Analysis 
      where CaseStatus = 'C' and 
        LastActivityDate between '2013-4-1 00:00:00.000' and '2013-4-30 23:59:59.000' 
     ) sub 
Group By DiffDate 
3

Nie możesz używać aliasu w klauzuli group by.

Użyj tabeli wyprowadzonej lub w twoim przypadku usuń 2. WYBIERZ.

select 
    count(CaseId), 
    DATEDIFF(day,CreateDate,LastActivityDate) AS DiffDate 
from 
    VW_Case_Analysis 
where 
    CaseStatus = 'C' 
    and LastActivityDate between '2013-4-1 00:00:00.000' and '2013-4-30 23:59:59.000' 
Group By 
    DATEDIFF(day,CreateDate,LastActivityDate) 
0

Czy to nie przyniesie takich samych rezultatów?

select Count(CaseId), 
        DATEDIFF(day,CreateDate,LastActivityDate) AS DiffDate 
      from VW_Case_Analysis 
      where CaseStatus = 'C' and 
        LastActivityDate between '2013-4-1 00:00:00.000' and '2013-4-30 23:59:59.000' 
GROUP BY DATEDIFF(day,CreateDate,LastActivityDate) 

Jestem nowicjuszem w SQL, więc może nie rozumiem tego poprawnie. Widziałem komentarz powyżej mojej z dokładną składnią, ale nie wiedziałem, czy to było właściwe ...

+0

Cześć Dan, SQL jesteś zapewniając wydaje się być taka sama jak @ Ahmeda. Więc jeśli jest to pytanie, nie powinno być publikowane jako odpowiedź, jeśli uważa się je za odpowiedź, nie ma potrzeby powtarzania odpowiedzi. Może mógłbyś ją usunąć? – bummi

+0

Witam, przepraszam za to. Z jakiegoś powodu nie mogę usunąć mojego oryginalnego komentarza. – DK91

0

jest to łatwe przykładem Realizacji Dyskusja

select selectResualt.num ,count(selectResualt.num) as count 
from (select src_num As num from mytable UNION ALL select dis_num As num from mytable) as selectResualt 
group by selectResualt.num 
order by count(selectResualt.num) DESC;> 
0

Można użyć CROSS APPLY aby utworzyć alias i używać go w klauzuli GROUP BY, tak:

select 
    count(CaseId), 
    DiffDate 
from 
    VW_Case_Analysis 
cross apply 
    (SELECT DATEDIFF(day,CreateDate,LastActivityDate) AS DiffDate) Alias 
where 
    CaseStatus = 'C' 
    and LastActivityDate between '2013-4-1 00:00:00.000' and '2013-4-30 23:59:59.000' 
Group By 
    DiffDate