[英]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.