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 のより使いやすい形式でしょうか?

4

2 に答える 2

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;
于 2013-03-06T20:35:45.570 に答える
1

行う:

SELECT CONVERT(CHAR(7),s.DateKey,120) AS Mjesec....
FROM ....
GROUP BY CONVERT(CHAR(7),s.DateKey,120)....
ORDER BY EmployeeKey
于 2013-03-06T20:30:21.473 に答える