2017-12-15 11 views
2

私のSQLサーバーでは、2つのテーブル、支払いと顧客があります。支払いには、顧客が行ったすべての取引が含まれます。私が知りたいのは、たとえ取引をしなくても毎月の支払い金額をどのように得るのかです(私は結果として0を得ることもできます)。これは私にすべての顧客のEverymonthをから支払われるすべての金額を与えるトランザクションが行われなかった場合でも1か月あたりのすべてのトランザクションの合計()

SELECT Customer.FirstName, Customer.LastName, 
    YEAR(Payment.PaymentDate)AS YEARS, MONTH(Payment.PaymentDate) AS MONTHS, 
    SUM(Amount)AS Total 
    FROM Payment 
    join Customer 
    ON Customer.CustomerId = Payment.CustomerId 
    GROUP BY Customer.FirstName, 
    Customer.LastName, MONTH(Payment.PaymentDate), YEAR(Payment.PaymentDate), 
    Payment.CustomerId 
    ORDER BY YEARS desc, MONTHS desc 

は今、私は私がして欲しい結果を得ます。

KATIE ELLIOTT 2006 2 2.99 
DIANNE  SHELTON 2006 2 4.99 
NATALIE MEYER 2006 2 5.98 
BETH FRANKLIN 2006 2 2.99 
MIGUEL BETANCOURT 2006 2 3.98 
ALBERTO HENNING 2006 2 2.99 
BEVERLY BROOKS 2006 2 2.99 

しかし、顧客によっては取引が行われなかった月がありました。私はそれらの結果を0にしてもらいたいと思っています。

どうすればいいですか?

+4

カレンダーのテーブルを作成します。それと外部結合。 – jarlh

+0

* * * SQL? SQLサーバー? MySQL? PostgreSQL?あなたの投稿を[編集]してタグ付けしてください。私はあなたが "SQLサーバー"と言っていることを知っているが、それは技術的には何でもよい。 Microsoft SQL Serverですか? –

答えて

1

cross joinを使用して行を生成できます。問題は月のリストを取得する方法です。あなたは月ごとに少なくとも一つのトランザクションを持っていると仮定すると、既存のデータを使用することができます。

SELECT c.FirstName, c.LastName, yyyymm.yyyy, yyyymm.mm, 
     SUM(p.Amount)AS Total 
FROM (SELECT DISTINCT YEAR(p.PaymentDate) as yyyy, MONTH(p.PaymentDate) as mm 
     FROM Payment p 
    ) yyyymm CROSS JOIN 
    Customer c LEFT JOIN 
    Payment p 
    ON c.CustomerId = p.CustomerId AND 
     YEAR(p.PaymentDate) = yyyymm.yyyy AND MONTH(p.PaymentDate) = yyyyymm.mm 
GROUP BY c.FirstName, c.LastName, yyyymm.yyyy, yyyymm.mm 
ORDER BY yyyymm.yyyy desc, yyyymm.mm desc; 
+0

ありがとう、これは私が必要としていたものです。私はそれを自分自身で明確にするために十字結合を調べます。 –

-1

は、例えば、下記参照し、それに応じて更新します。

IF OBJECT_ID('tempdb..#Transcation') IS NOT NULL 
DROP TABLE tempdb..##Transcation; 
GO 

IF OBJECT_ID('tempdb..#Customer') IS NOT NULL 
DROP TABLE tempdb..#Customer; 
GO 

CREATE TABLE #Customer (
RowNo INT IDENTITY(1,1), 
CID INT, 
NAME VARCHAR(256) 
); 
GO 

INSERT INTO #Customer VALUES(1,'A'); 
INSERT INTO #Customer VALUES(2,'B'); 
INSERT INTO #Customer VALUES(3,'C'); 
INSERT INTO #Customer VALUES(4,'D'); 
GO 

CREATE TABLE #Transcation (
RowNo INT IDENTITY(1,1), 
CID INT, 
[Year] INT, 
[Month] INT, 
Amount FLOAT 
); 
GO 

INSERT INTO #Transcation VALUES (1,2017,1,5.6); 
INSERT INTO #Transcation VALUES (2,2017,1,4.6); 
INSERT INTO #Transcation VALUES (1,2017,2,5.6); 
INSERT INTO #Transcation VALUES (2,2017,2,3.6); 
INSERT INTO #Transcation VALUES (1,2017,3,5.6); 
INSERT INTO #Transcation VALUES (2,2017,3,3.6); 
INSERT INTO #Transcation VALUES (1,2017,4,6.6); 
INSERT INTO #Transcation VALUES (2,2017,4,7.6); 
INSERT INTO #Transcation VALUES (1,2017,5,8.6); 
INSERT INTO #Transcation VALUES (2,2017,5,9.6); 
GO 

SELECT NAME, ISNULL([YEAR],0), ISNULL([Month],0), ISNULL(SUM(Amount) OVER (PARTITION BY NAME, [YEAR], [Month]),0) 
FROM #Customer AS A LEFT JOIN 
#Transcation AS B ON A.CID = B.CID 
関連する問題