2016-09-09 8 views
1

私は今週のデータ(常に変化する)と前年の日付データを使って1つのSQLテーブルを作成しようとしています。私は参加しなければならない複数のテーブルを持っていますが、すべてを1つのテーブルに作成する方法はわかりません。ここで私はこれまで持っているものです。今週のデータテーブルとその日付1年前

------- -------現在の年

DECLARE 
@CURRENTDATE DATE, 
@BEGINDATE DATE 

SET @CURRENTDATE = CONVERT(DATE,GETDATE()) ---// TODAY'S DATE //--- 
SET @BEGINDATE = DATEADD(DAY, -7, GETDATE()) ---// A WEEK BEFORE TODAY'S DATE //--- 

SELECT SALES.*, RECRUITS.Recruits 
FROM 
(
    SELECT 
    CONVERT(VARCHAR(10), A.[ORDER DATE], 101) AS 'DAY' 
    , 'Sales Revenue Current Year' = FORMAT(SUM(A.[GRAND TOTAL]) ,'C', 'EN-US') 
    , 'Comm. Sales Volume Current Year' = FORMAT(sum(a. [QUALIFYING VOLUME]), 'C', 'EN-US') 
    FROM TABLE1 a 
    WHERE CONVERT(VARCHAR(10), A.[ORDER DATE], 101) >= @BEGINDATE AND CONVERT(VARCHAR(10), A.[ORDER DATE], 101) < @CURRENTDATE 
    GROUP BY CONVERT(VARCHAR(10), A.[ORDER DATE], 101) 
) SALES, 
(
    SELECT 
    CONVERT(VARCHAR(10),a.[start date],101) AS 'DAY' 
    ,count(b.[id number]) as Recruits 
    from TABLE2 a 
    left join 
    TABLE3 b 
    on a.enroller = b. [id number] 
    WHERE CONVERT(VARCHAR(10), A.[START DATE], 101) >= @BEGINDATE AND CONVERT(VARCHAR(10), A.[START DATE], 101) < @CURRENTDATE 
    group by a.[start date] 
) RECRUITS 
WHERE SALES.DAY = RECRUITS.DAY 

私は前年度の同じスクリプトを持っています。私は日付を-366と-373日に設定する以外は同じです。どんな助けも素晴らしいだろう!

+1

MySQLまたはSQL Server? – Santi

+0

コードがtsqlであるため、 'mysql'タグを削除しました。 – JNevill

+0

なぜ新しいテーブルの代わりにビューはありませんか?こうして、それはいつもちょうど先週になることができます。 –

答えて

0

以下のように複数の日付に「OR」を付けることができますが、より良い解決策は、「WeekOfYear」、「WeekOfMonth」、「QuarterOfYear」などの日次の日付のリストを使用することです"、" IsHoliday "などです。次に、そのテーブルに対して日付を結合し、" where t1.WeekOfYear = t2.WeekOfYear "というクエリを入力できます。

DECLARE 
    @EndDate DATE   = GETDATE() ---// TODAY'S DATE //--- 
    , @StartDate DATE  = DATEADD(DAY, -7, GETDATE()) ---// A WEEK BEFORE TODAY'S DATE //--- 
    , @LYStartDate DATE  = DATEADD(YEAR, -1, GETDATE()) ---// A YEAR BEFORE TODAY'S DATE //--- 
    , @LYEndDate DATE  = DATEADD(DAY, -7, DATEADD(YEAR, -1, GETDATE())) ---// A YEAR AND A WEEK BEFORE TODAY'S DATE //--- 

SELECT SALES.*, RECRUITS.Recruits 
FROM 
(
    SELECT 
     'DAY' = CONVERT(VARCHAR(10), A.[ORDER DATE], 101) 
     , 'Sales Revenue Current Year' = FORMAT(SUM(A.[GRAND TOTAL]) ,'C', 'EN-US') 
     , 'Comm. Sales Volume Current Year' = FORMAT(sum(a. [QUALIFYING VOLUME]), 'C', 'EN-US') 
    FROM TABLE1 a 
    WHERE (
     (CAST(A.[ORDER DATE] AS DATE) >= @StartDate AND CAST(A.[ORDER DATE] AS DATE) <= @EndDate) 
     OR 
     (CAST(A.[ORDER DATE] AS DATE) >= @LYStartDate AND CAST(A.[ORDER DATE] AS DATE) <= @lyEndDate) 
     ) 
    GROUP BY CAST(A.[ORDER DATE] AS DATE) 
) SALES, 
(
    SELECT 
     'DAY' = CAST(a.[start date] AS DATE) 
     , Recruits = COUNT(b.[id number]) 
    FROM TABLE2 a 
     LEFT JOIN TABLE3 b 
      ON a.enroller = b. [id number] 
    WHERE (
     (CAST(A.[START DATE] AS DATE) >= @StartDate AND CAST(A.[ORDER DATE] AS DATE) <= @EndDate) 
     OR 
     (CAST(A.[START DATE] AS DATE) >= @lyStartDate AND CAST(A.[ORDER DATE] AS DATE) <= @LYEndDate) 
    GROUP BY CAST(a.[start date] AS DATE) 
) RECRUITS 
WHERE SALES.DAY = RECRUITS.DAY 
関連する問題