2013-03-06 126 views
0

我想根據YEAR-MONTH的銷售結果進行分組。我該做的結果當前查詢的樣子:按月分組數據

SELECT Cast(Year(s.datekey) AS VARCHAR(4)) + '-' 
     + Cast(Month(s.datekey) AS VARCHAR(2)) AS Mjesec, 
     e.employeekey, 
     Sum(s.totalcost)      AS SalesAmount 
FROM factsales s 
     INNER JOIN dimstore st 
       ON s.storekey = st.storekey 
     INNER JOIN dimemployee e 
       ON e.employeekey = st.storemanager 
WHERE s.datekey BETWEEN '2007-01-01' AND '2007-01-05' 
GROUP BY e.employeekey, 
      Cast(Year(s.datekey) AS VARCHAR(4)) + '-' 
      + Cast(Month(s.datekey) AS VARCHAR(2)) 
ORDER BY employeekey 

我,如果有任何其他更好,更優雅的方式來達到同樣的效果不知道?也許,在c#中DateTime更友好的格式?

+0

您能夠在C#中的數據格式而不是在SQL中? – msmucker0527 2013-03-06 20:29:41

+0

我不明白。你想按月分組數據,只在1月1日和1月5日之間?你知道C#有一個'Format()'命令,對嗎? – 2013-03-06 20:30:30

+0

日期可能會動態變化。這不僅僅是關於C#,我一般問是否這是一個好的解決方案。 – 2013-03-06 20:34:08

回答

1

有效得多,通過使用日期數學比轉換爲字符串剝離時間。將特定的字符串格式保留到最後(或者更好的是,在C#中使用Format())也更有效。

;WITH c AS 
(
    SELECT m = DATEADD(MONTH, DATEDIFF(MONTH, 0, s.datekey), 0), 
    e.employeekey, s.totalcost 
    FROM dbo.factsales AS s 
    INNER JOIN dbo.dimstore AS st 
    ON s.storekey = st.storekey 
    INNER JOIN dimemployee AS e 
    ON e.employeekey = st.storemanager 
    WHERE s.datekey >= '20070101' AND s.datekey < '20070106' 
), 
d AS 
(
    SELECT m, employeekey, SalesAmount = SUM(totalcost) 
    FROM c 
    GROUP BY m, employeekey 
) 
SELECT 
    Mjesec = CONVERT(CHAR(7), m, 120), 
    employeekey, 
    SalesAmount 
FROM d 
ORDER BY employeekey; 

如果你能在你的應用程序的格式,那麼你可以摺疊這:

;WITH c AS 
(
    SELECT m = DATEADD(MONTH, DATEDIFF(MONTH, 0, s.datekey), 0), 
    e.employeekey, s.totalcost 
    FROM dbo.factsales AS s 
    INNER JOIN dbo.dimstore AS st 
    ON s.storekey = st.storekey 
    INNER JOIN dimemployee AS e 
    ON e.employeekey = st.storemanager 
    WHERE s.datekey >= '20070101' AND s.datekey < '20070106' 
) 
SELECT Mjesec = m, employeekey, SalesAmount = SUM(totalcost) 
    FROM c 
    GROUP BY m, employeekey 
    ORDER BY employeekey; 

甚至:

SELECT Mjesec = DATEADD(MONTH, DATEDIFF(MONTH, 0, s.datekey), 0), 
    e.employeekey, s.totalcost 
    FROM dbo.factsales AS s 
    INNER JOIN dbo.dimstore AS st 
    ON s.storekey = st.storekey 
    INNER JOIN dimemployee AS e 
    ON e.employeekey = st.storemanager 
    WHERE s.datekey >= '20070101' AND s.datekey < '20070106' 
    GROUP BY DATEADD(MONTH, DATEDIFF(MONTH, s.datekey, 0), 0), e.employeekey 
    ORDER BY employeekey; 
1

執行:

SELECT CONVERT(CHAR(7),s.DateKey,120) AS Mjesec.... 
FROM .... 
GROUP BY CONVERT(CHAR(7),s.DateKey,120).... 
ORDER BY EmployeeKey