2016-12-15 11 views
1

Stored Proceduresと同じwhere句のジョインを持つStored Proceduresがありますが、唯一の違いはFROMという表です。可能であれば、複製を削除したいと思います。これは実施例である:ジョインなどでクエリを簡略化する方法

SELECT x.Month_Name 
, x.Invoice_Amt 
, y.Payment_Amt 
FROM 
(
    SELECT d.Month_Name 
     , d.Month 
     , sum(i.Amount) AS Invoice_Amt 
    FROM Invoice i 
     INNER JOIN DATE d ON i.Trans_Date = d.PK_Date 
    WHERE d.Month BETWEEN '2016-01-01' AND '2016-02-01' 
      AND i.Account = '1-AAA' 
    GROUP BY d.Month 
      , d.Month_Name 
) x 
JOIN 
(
    SELECT d.Month_Name 
     , sum(p.Amount) AS Payment_Amt 
    FROM Payment p 
     INNER JOIN DATE d ON p.Payment_Date = d.PK_Date 
    WHERE d.Month BETWEEN '2016-01-01' AND '2016-02-01' 
      AND p.Account = '1-AAA' 
    GROUP BY d.month 
      , d.month_Name 
) y ON x.Month_Name = y.Month_Name 
ORDER BY x.Month 
     , x.Month_Name; 

これは私が目指してるものの非稼働例です。私は、SQLフィドルが働いて得ることができないように、データベーススキーマ

SELECT d.Month_Name 
    , d.Month 
    , sum(i.Amount) AS Invoice_Amt 
    , sum(p.Amount) AS Payment_Amt 
FROM Invoice i 
    INNER JOIN DATE d ON i.Trans_Date = d.PK_Date 
    JOIN Payment p ON i.Account = p.Account 
WHERE d.Month BETWEEN '2016-01-01' AND '2016-02-01' 
     AND i.Account = '1-AAA' 
GROUP BY d.Month 
     , d.Month_Name 
ORDER BY d.Month 
     , d.Month_Name; 

CREATE TABLE Date 
(PK_Date datetime, 
Month  datetime, 
Month_Name varchar(20)); 

INSERT INTO Date 
VALUES 
('2016-01-01', '2016-01-01', 'January 2016'), 
('2016-01-15', '2016-01-01', 'January 2016'), 
('2016-02-04', '2016-02-01', 'February 2016'), 
('2016-02-15', '2016-02-01', 'February 2016'); 

CREATE TABLE Invoice 
(Account varchar(15), 
Trans_Date datetime, 
Amount  float); 

INSERT INTO Invoice 
VALUES 
('1-AAA', '2016-01-01', 521.32), 
('1-AAA', '2016-02-04', 854.20); 

CREATE TABLE Payment 
(Account  varchar(15), 
Payment_Date datetime, 
Amount  float); 

INSERT INTO Payment 
VALUES 
('1-AAA', '2016-01-15', 410.50), 
('1-AAA', '2016-02-15', 120.98); 

答えて

2

Iは、ベーステーブルとして[DATE]を使用して外部結合[請求書] & [支払]を左になります。あなたがすべてで[日付]テーブルは必要ありません

SELECT d.Month_Name 
    , d.Month 
    , sum(i.Amount) AS Invoice_Amt 
    , sum(p.Amount) AS Payment_Amt 
FROM DATE d 
LEFT OUTER JOIN Invoice i ON i.Trans_Date = d.PK_Date 
LEFT OUTER JOIN Payment p ON p.Payment_Date = d.PK_Date 
WHERE d.Month BETWEEN '2016-01-01' AND '2016-02-01' 
     AND (i.Account = '1-AAA' OR p.Account = '1-AAA') 
GROUP BY d.Month 
     , d.Month_Name 
ORDER BY d.Month 
     , d.Month_Name; 
0

:そうのような 。 Updated query >>

DECLARE @dt_from \t DATETIME \t \t = \t '2016-01-01'; 
 
DECLARE @dt_to \t \t DATETIME \t \t = \t '2016-02-01'; 
 
DECLARE @acc \t \t VARCHAR(256) \t = \t '1-AAA'; 
 

 

 
SELECT 
 
\t [Month_Name] \t = \t DATENAME(MONTH, [agg_data].[dt]) + SPACE(1) + CAST(DATEPART(YEAR, [agg_data].[dt]) AS VARCHAR(4)) 
 
-- \t ,[Month] \t \t = \t [agg_data].[dt] 
 
\t ,[Invoice_Amt] \t = \t [agg_data].[amount_inv] 
 
\t ,[Payment_Amt] \t = \t [agg_data].[amount_pmt] 
 
FROM 
 
\t (
 
\t \t SELECT 
 
\t \t \t [dt] \t \t \t = \t ISNULL([i].[dt], [p].[dt])  
 
\t \t \t ,[amount_inv] \t = \t ISNULL([i].[amount], 0) 
 
\t \t \t ,[amount_pmt] \t = \t ISNULL([p].[amount], 0) 
 
\t \t \t ,[acc] \t \t \t = \t ISNULL([i].[acc], [p].[acc]) 
 
\t \t FROM 
 
\t \t \t (
 
\t \t \t \t SELECT 
 
\t \t \t \t \t [acc] \t \t = \t [account] \t \t 
 
\t \t \t \t \t ,[dt] \t \t = \t DATEFROMPARTS(YEAR([trans_date]), MONTH([trans_date]), 1) 
 
\t \t \t \t \t ,[amount] \t = \t SUM([amount]) 
 
\t \t \t \t FROM 
 
\t \t \t \t \t [invoice] 
 
\t \t \t \t GROUP BY 
 
\t \t \t \t \t DATEFROMPARTS(YEAR([trans_date]), MONTH([trans_date]), 1) 
 
\t \t \t \t \t ,[account] 
 
\t \t \t) \t AS \t [i] 
 
\t \t FULL JOIN 
 
\t \t \t ( 
 
\t \t \t \t SELECT 
 
\t \t \t \t \t [acc] \t \t = \t [account] \t \t 
 
\t \t \t \t \t ,[dt] \t \t = \t DATEFROMPARTS(YEAR([payment_date]), MONTH([payment_date]), 1) 
 
\t \t \t \t \t ,[amount] \t = \t SUM([amount]) 
 
\t \t \t \t FROM 
 
\t \t \t \t \t [payment] 
 
\t \t \t \t GROUP BY 
 
\t \t \t \t \t DATEFROMPARTS(YEAR([payment_date]), MONTH([payment_date]), 1) 
 
\t \t \t \t \t ,[account] 
 
\t \t \t) \t AS \t [p] 
 
\t \t ON 
 
\t \t \t \t [i].[acc] \t = \t [p].[acc] 
 
\t \t \t AND \t [i].[dt] \t = \t [p].[dt] 
 
\t) \t AS \t [agg_data] 
 
WHERE 
 
\t \t [dt] \t BETWEEN @dt_from AND @dt_to 
 
\t AND \t [acc] \t = \t \t @acc 
 
ORDER BY 
 
\t [dt] ASC; \t \t \t \t

関連する問題