2013-03-06 129 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