2016-05-05 13 views
1

SQL Azureを使用してデータベースにクエリを作成します。SQL Azureは、そのオフィス内のオフィスとスタッフのセットとして月ごとに売上高を返します。 enter image description here この呼ばれvwOfficeAndNegSalesTotalsを返し、次のようになります問い合わせ::私は交渉の日付に年FeeValueの累計を提供して別の列を追加する必要があります年内の列の値に基づいて実行中の列の合計

 
SELECT OfficeID, 
    DATENAME(Month,PipelineDate) + ' ' + DATENAME(Year,PipelineDate) as [PipelineMonth], 
    OfficeName, 
    Negotiator, 
    Status, 
    SUM(Fee) as FeeValue 
FROM vwBankingProjections 
GROUP BY OfficeID, 
    DATENAME(Month,PipelineDate) + ' ' + DATENAME(Year,PipelineDate), 
    OfficeName, 
    Negotiator, 
    Status, 
    DATEPART(Month,PipelineDate), 
    DATEPART(YEAR,PipelineDate) 

下の画像でその行には、その行の月までを意味する「今日までの」年が含まれています。さらに、ステータスが[支払いを受け取った]の場合は、FeeValueの合計だけにする必要があります。ちょうどではなく、実際の日付が含まれないあなたはvwOfficeAndNegSalesTotalsの構造から言うことができるように

Figures including YTD values

、クエリはその上に、それが基づいています(vwBankingProjections):

だから、それはこのようなものを返しますテキストMonth + Year - これらの日付はPipelineDate列にあります。

私の最初の試みでは、2016年5月(執筆時点で)の行を見ることは今までの年となりますが、その年の合計をその行(2016年4月の行を表示する場合は、2016年1月〜4月の合計となります)。場合、それは任意のヘルプのですが、ここで私はそのために思い付いたものです:

 
SELECT OfficeID, 
    DATENAME(Year,PipelineDate) as [PipelineYear], 
    OfficeName, 
    Negotiator, 
    SUM(Fee) as YTDFee 
FROM vwBankingProjections 
WHERE Status IN ('Payment Received') 
GROUP BY OfficeID, 
    DATENAME(Year,PipelineDate), 
    OfficeName, 
    Negotiator 

誰でも助けることができるならば、これは少し私のスキルセットを超えているとして、私は、感謝されると思います。

どうもありがとう

アンドリュー

答えて

1

あなたはOVER SUM()を使用することができます()。

表の作成と移入。

CREATE TABLE dbo.Sales 
(
    OfficeID int NOT NULL, 
    PipelineMonth date NOT NULL 
     CHECK (DAY(PipelineMonth) = 1), 
    OfficeName nvarchar(25) NOT NULL, 
    Negotiator nvarchar(25) NOT NULL, 
    [Status] nvarchar(25) NOT NULL, 
    FeeValue int NOT NULL, 
    FeeValueReceived AS IIF([Status] = N'Payment received', FeeValue, 0) 
); 
GO 

INSERT INTO dbo.Sales (OfficeID, PipelineMonth, OfficeName, Negotiator, [Status], FeeValue) 
    VALUES 
    (1, '2016-01-01', N'London', N'Fred', N'Payment received', 5000), 
    (1, '2016-01-01', N'London', N'Fred', N'Completed', 4800), 
    (1, '2016-01-01', N'London', N'Kate', N'Payment received', 5980), 
    (1, '2016-01-01', N'London', N'Kate', N'Completed', 7000), 
    (1, '2016-01-01', N'London', N'Bob', N'Payment received', 9250), 
    (2, '2016-01-01', N'Birmingham', N'Jo', N'Payment received', 7870), 
    (2, '2016-01-01', N'Birmingham', N'Kathryn', N'Payment received', 3690), 
    (2, '2016-01-01', N'Birmingham', N'Kathryn', N'Completed', 8545), 
    (1, '2016-02-01', N'London', N'Fred', N'Payment received', 6500), 
    (1, '2016-02-01', N'London', N'George', N'Completed', 2575), 
    (1, '2016-02-01', N'London', N'George', N'Payment received', 7500), 
    (1, '2016-02-01', N'London', N'Kate', N'Payment received', 8393), 
    (1, '2016-02-01', N'London', N'Bob', N'Payment received', 6125); 

次に、SUM()OVER()でSELECT文を作成します。

SELECT OfficeID, PipelineMonth, OfficeName, Negotiator, [Status], FeeValue, 
     SUM(FeeValueReceived) OVER (PARTITION BY OfficeID, Negotiator, YEAR(PipelineMonth) ORDER BY PipelineMonth, [Status] DESC, FeeValue DESC) AS 'YTD' 
    FROM dbo.Sales 
    ORDER BY PipelineMonth, OfficeID, Negotiator, [Status] DESC, FeeValue DESC 

enter image description here

参照オンラインブック>句(のTransact-SQL)OVER:https://msdn.microsoft.com/en-us/library/ms189461.aspx

+0

これは完璧です。ありがとうございます。あなたが送ったBooks Onlineのリンクを読んだことがありますが、それは助けになりますが、内容の一部を理解することは本当に難しいです。例: _ ROWS/RANGEが指定され、(短い構文)にが使用されている場合、この指定はウィンドウフレーム境界の開始点に使用され、CURRENT ROWは境界の終了に使用されますポイント。たとえば、 "行5进行"は "行5行と行の間に行"に等しいです。 _ 私はちょうど高密度であると確信していますが、私は助けを見つけることをお勧めする他の場所にありますか? – user1401286

+0

はい、申し訳ありませんが、書籍オンラインは必ずしも容易ではありません。 OVER句は一目ぼれ、特にROW OR RANGE部分がかなり複雑です。Itzik Ben-GanのMicrosoft SQL Server 2012 T-SQLの基礎>第7章:クエリの基礎>ウィンドウ関数を参照してください。 – RichardCL

+0

また、彼はフォローアップの本:Windows関数を使用したMicrosoft SQL Server 2012高性能T-SQL(開発者リファレンス)を書いています。私はそれを持っていないが、それはおそらく良いです。 – RichardCL

関連する問題