2014-10-31 82 views
3

組我有這樣的SQL:如何通過派生列

Select Hours, LastName, FirstName, UUID, 
     Case 
     When DatePart(WeekDay, Date) = 1 Then 
      Date - 6 
     Else 
      Date - DatePart(Weekday, Date) + 2 
     End as [Week] 
    From Entry 
    Where Date between '06/30/2014' and '10/31/2014' 

,我想要做什麼是由[周]列,我使用Case語句創建的組這一點。這是可能的嗎?如果是這樣,我該怎麼做呢?

謝謝!

+2

簡單用了別名 – 2014-10-31 17:18:06

+0

添加組相同的代碼我做到這一點,得到了,因爲它不是在聚合函數或包含在此「列Entry.Hours'在選擇列表中無效GROUP BY子句「。 – 2014-10-31 17:20:36

+0

如果不包含組中的其他列,則需要對它們進行彙總(即SUM,MAX,MIN等) – DavidG 2014-10-31 17:21:58

回答

1

我猜你正在努力尋找一個員工的小時max or sum。所以這樣的事情應該可以幫到你。請記住,沒有聚合函數的列應該出現在group by中。

SELECT Max(Hours),-- sum(Hours) 
     LastName, 
     FirstName, 
     UUID, 
     CASE 
     WHEN Datepart(WeekDay, Date) = 1 THEN Date - 6 
     ELSE Date - Datepart(Weekday, Date) + 2 
     END AS [Week] 
FROM Entry 
WHERE Date BETWEEN '06/30/2014' AND '10/31/2014' 
GROUP BY LastName, 
      FirstName, 
      UUID, 
      CASE 
      WHEN Datepart(WeekDay, Date) = 1 THEN Date - 6 
      ELSE Date - Datepart(Weekday, Date) + 2 
      END 
+0

這個技巧!謝謝! – 2014-10-31 17:37:42

2

您不能在SQL Server中的列別名組 - 你需要一羣以表達:

Select Hours, LastName, FirstName, UUID, 
    Case 
    When DatePart(WeekDay, Date) = 1 Then 
     Date - 6 
    Else 
     Date - DatePart(Weekday, Date) + 2 
    End as [Week] 
From Entry 
Where Date between '06/30/2014' and '10/31/2014' 
GROUP BY 
    Case 
    When DatePart(WeekDay, Date) = 1 Then 
     Date - 6 
    Else 
     Date - DatePart(Weekday, Date) + 2 
    End 

雖然你可以使用子查詢使它有點清潔:

SELECT * FROM 
    (
    Select Hours, LastName, FirstName, UUID, 
     Case 
     When DatePart(WeekDay, Date) = 1 Then 
      Date - 6 
     Else 
      Date - DatePart(Weekday, Date) + 2 
     End as [Week] 
    From Entry 
    Where Date between '06/30/2014' and '10/31/2014' 
    ) 
    GROUP BY [Week] 

但是在任何情況下,您都需要決定如何在組表達式中集合而不是的值。 Hours有意義做一筆款項,但您如何彙總名稱和ID?如果沒有聚集是必要的只是讓他們出來的結果:

SELECT Week, SUM(Hours) FROM 
    (
    Select Hours, LastName, FirstName, UUID, 
     Case 
     When DatePart(WeekDay, Date) = 1 Then 
      Date - 6 
     Else 
      Date - DatePart(Weekday, Date) + 2 
     End as [Week] 
    From Entry 
    Where Date between '06/30/2014' and '10/31/2014' 
    ) 
    GROUP BY [Week] 
+0

如果我把非聚合的項目放在組中,sql server很開心。我會嘗試你的解決方案。 – 2014-10-31 17:29:35