簡體   English   中英

如何從select語句中創建的列中分組?

[英]How can I group from a column created in a select statement?

如何在select語句中按派生列分組?

我有一個查詢:

select sum(hours) as summedhours, vendoremployeeid, vendorUserName, lineofbusiness, timesheetdate, 
case 
when datepart(weekday,timesheetdate) =1 then dateadd(weekday,4,timesheetdate)
when datepart(weekday,timesheetdate) =2 then dateadd(weekday,3,timesheetdate)
when datepart(weekday,timesheetdate) =3 then dateadd(weekday,2,timesheetdate)
when datepart(weekday,timesheetdate) =4 then dateadd(weekday,1,timesheetdate)
when datepart(weekday,timesheetdate) =5 then dateadd(weekday,0,timesheetdate)
when datepart(weekday,timesheetdate) =6 then dateadd(weekday,6,timesheetdate)
when datepart(weekday,timesheetdate) =7 then dateadd(weekday,5,timesheetdate)
end 
as FridaysGrouping
from viewProjects
group by FridaysGrouping, vendoremployeeid, vendorusername, lineofbusiness, timesheetdate
order by FridaysGrouping asc

當我運行上述命令時,它給我一個錯誤,指出列名稱“ FridaysGrouping'不存在。我相信這是因為sql服務器的執行順序是:from> where> group by> have> select> order通過

按上面的派生列分組的最佳方法是什么?

group by保留相同的計算列

select sum(hours) as summedhours, vendoremployeeid, vendorUserName, lineofbusiness, timesheetdate, 
case 
when datepart(weekday,timesheetdate) =1 then dateadd(weekday,4,timesheetdate)
when datepart(weekday,timesheetdate) =2 then dateadd(weekday,3,timesheetdate)
when datepart(weekday,timesheetdate) =3 then dateadd(weekday,2,timesheetdate)
when datepart(weekday,timesheetdate) =4 then dateadd(weekday,1,timesheetdate)
when datepart(weekday,timesheetdate) =5 then dateadd(weekday,0,timesheetdate)
when datepart(weekday,timesheetdate) =6 then dateadd(weekday,6,timesheetdate)
when datepart(weekday,timesheetdate) =7 then dateadd(weekday,5,timesheetdate)
end 
as FridaysGrouping
from viewProjects
group by FridaysGrouping, vendoremployeeid, vendorusername, lineofbusiness, timesheetdate,
case 
when datepart(weekday,timesheetdate) =1 then dateadd(weekday,4,timesheetdate)
when datepart(weekday,timesheetdate) =2 then dateadd(weekday,3,timesheetdate)
when datepart(weekday,timesheetdate) =3 then dateadd(weekday,2,timesheetdate)
when datepart(weekday,timesheetdate) =4 then dateadd(weekday,1,timesheetdate)
when datepart(weekday,timesheetdate) =5 then dateadd(weekday,0,timesheetdate)
when datepart(weekday,timesheetdate) =6 then dateadd(weekday,6,timesheetdate)
when datepart(weekday,timesheetdate) =7 then dateadd(weekday,5,timesheetdate)
end
order by FridaysGrouping asc

或使用CTE CTE找到計算列,然后在外部select進行group by 更具可讀性

with cte as
(
select hours , vendoremployeeid, vendorUserName, lineofbusiness, timesheetdate, 
case 
when datepart(weekday,timesheetdate) =1 then dateadd(weekday,4,timesheetdate)
when datepart(weekday,timesheetdate) =2 then dateadd(weekday,3,timesheetdate)
when datepart(weekday,timesheetdate) =3 then dateadd(weekday,2,timesheetdate)
when datepart(weekday,timesheetdate) =4 then dateadd(weekday,1,timesheetdate)
when datepart(weekday,timesheetdate) =5 then dateadd(weekday,0,timesheetdate)
when datepart(weekday,timesheetdate) =6 then dateadd(weekday,6,timesheetdate)
when datepart(weekday,timesheetdate) =7 then dateadd(weekday,5,timesheetdate)
end 
as FridaysGrouping
from viewProjects
)
SELECT Sum(hours) summedhours,
       vendoremployeeid,
       vendorUserName,
       lineofbusiness,
       timesheetdate,
       FridaysGrouping
FROM   cte
GROUP  BY FridaysGrouping,
          vendoremployeeid,
          vendorusername,
          lineofbusiness,
          timesheetdate
ORDER  BY FridaysGrouping ASC 

幾天前我遇到了這個問題,並通過使用Inner Join解決了。

Select ... , col1, ... From ...
Inner Join
(Select ... as col1, ... From ...  --newly created column here can be used outside as col1 directly.
)tb1
On ...
Where ...
Group by ...
Order by ...

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM