2008-10-08 59 views
3

我正在將DB從MySQL(使用ODBC)移動到MS SQL,我想將「SQL查詢」轉換爲LINQ。有人可以幫我解決這個問題(它應該爲每個位置和組的結果按月收費):對LINQ的SQL命令(pivoting)

SELECT 
sum(case when Location="Location1" then Charge else 0 end) as Location1, 
sum(case when Location="Location2" then Charge else 0 end) as Location2, 
sum(case when Location="Location3" then Charge else 0 end) as Location3, 
MAKEDATE(YEAR(OrderTime),DAYOFYEAR(OrderTime)) AS date FROM Sales 
GROUP BY YEAR(OrderTime),MONTH(OrderTime) 
ORDER BY OrderTime DESC 

輸出應該是這樣的:

Location1 | Location2 | Location3 | date 

編輯:

我tryed從這裏使用LINQ示例:

Is it possible to Pivot data using LINQ?

var query = context.log_sales 
          .GroupBy(c => c.OrderTime) 
          .Select(g => new 
          { 
           Date = g.Key, 
           Location1 = g.Where(c => c.Location == "Location1").Sum(c => c.Charge) ?? 0, 
           Location2 = g.Where(c => c.Location == "Location2").Sum(c => c.Charge) ?? 0 
          }).ToList(); 

,它幾乎是我需要。也應該按年分組,我不知道如何做到這一點。

+0

對答案的工作......只是想提到SQL中的ORDER BY無效。 OrderTime被分組了,不能在那裏使用。 – 2008-10-08 18:00:26

回答

6

這可能有幫助。

context.log_sales 
.GroupBy(s => new {Year = OrderTime.Year, Month = OrderTime.Month}) 
.Select 
(g => new { 
    Date = new DateTime(g.Key.Year, g.Key.Month, 1), 
    Location1 = g.Where(s => s.Location == "Location1").Sum(s => s.Charge), 
    Location2 = g.Where(s => s.Location == "Location2").Sum(s => s.Charge), 
    Location3 = g.Where(s => s.Location == "Location3").Sum(s => s.Charge), 
    } 
) 
.OrderBy(x => x.Date); 
+0

你檢查過什麼SQL產生這個Linq表達式了嗎?這是相當巨大的。 – GrZeCh 2008-10-09 09:37:08

0

..你知道嗎也許如何使添加位置動態選擇?例如從列表/數組。

編輯:..或者可能使位置動態加載,並設置哪些位置應選擇之前加載Where語句。這可能嗎?