2016-08-09 4 views
0

次のコードと、SQL Server Management Studio 2012で作成された次のクエリがあります。私はActualHoursPerWeekだろうSUMIFをTSQLに翻訳する

列Gは ClientIDと列になり
=SUMIF(G2:G961,G2,I2:I961) 

WITH cteUniqueClients AS 
(
    SELECT 
     CASE 
      WHEN ServiceActualEndDate IS NULL 
       AND LAG(ClientID,1) OVER(PARTITION BY ClientID, ServiceProvider ORDER BY ServiceActualEndDate DESC, StartDateFormatted DESC) = ClientID 
       THEN 0 
      WHEN ServiceActualEndDate IS NOT NULL 
       THEN 0 
      ELSE 1 
     END AS UniqueClient, 
     CASE 
      WHEN LAG(ActualHoursPerWeek,1) OVER (PARTITION BY ClientID, ServiceProvider ORDER BY StartDateFormatted DESC) = ActualHoursPerWeek 
       THEN 0 
       ELSE 1 
     END AS UniqueService, 
     ClientID, ClientName, 
     ActualHoursPerWeek, 
     ServicePlannedStartDate, ServiceActualStartDate 
    FROM 
     dbo.tTable1 
    WHERE 
     (ServiceActualStartDate <= '2016-08-09' OR ServicePlannedStartDate <= '2016-08-09') 
     AND ServiceActualEndDate IS NULL 
     AND (ServicePlannedEndDate > '2016-08-09' OR ServicePlannedEndDate IS NULL) 
     AND ClientDeathDate IS NULL   
) 
SELECT 
    COUNT(ClientID) OVER (PARTITION BY ClientID ORDER BY ClientID) AS RecordCount, 
    cteUniqueClients.* 
FROM 
    cteUniqueClients 
WHERE 
    UniqueService = 1 
ORDER BY 
    ClientID ASC 

そして、次のExcelの数式。

すべてのレポート列を保持しながらこれら2つを結びつける方法はありますか?

以下は、望ましいExcel出力のイメージです。

Updated Excel Output

+0

あなたは 'SUMIF'で何を達成しようとしていますか?これは、その行とすべての下位行(上位行が除外されている)から 'ClientID'のために' ActualHoursPerWeek'を追加するようです。したがって、 'ClientID'が行1-3で同じなら、行1は1-3の合計を得、行2は2-3の合計を得、行3はそれ自身を得るでしょう。 (式が1つのセルで作成され、コピーされたと仮定して) – SMM

+0

@SMMこれは、Excelファイルの結果が正しいことを示しています。私はClientIDとAcutalHoursPerWeekでデータをソートし、一意のクライアント列を使用して一意のクライアントのみを表示することもできますが、合計時間も表示できます。 これはちょっとばかだと申し訳ありません – NHier1992

+0

元のシートには、合計に下の行だけが含まれていることを確認するために、非常に特定の並べ替え順序が必要です。それらの列はテーブルに含まれていますか?目的の出力イメージを作成するために使用したソースExcelを確認すると役立ちます。また、おそらくテーブルスキーマ。 – SMM

答えて

0

申し訳ありませんが...私の上に掲示誰かとして:-)忙しい一日がこれを行う方法があると信じています。しかし、私はここでの鍵はあなたに並べ替えの注文に注意を払っていると思います。私はあなたが警告で必要なものを得るために次のコードを書いています。私はテストテーブルを含めました。

declare @tbl table (
Ident     int identity (1,1), 
RecordCount    int, 
UniqueClient   int, 
ClientID    int, 
ClientName    varchar(20), 
ActualHoursPerService float 
); 

insert into @tbl values 
(1,1,1,'Pam',18.75), 
(1,1,2,'Collin',8.75), 
(1,1,3,'William',19.83), 
(1,1,4,'Andy',10), 
(5,0,5,'James',1.19), 
(5,0,5,'James',1.75), 
(5,0,5,'James',2.31), 
(5,0,5,'James',3.5), 
(5,0,5,'James',7), 
(1,1,6,'Ford',12) 

select * from @tbl order by ClientID; 

select sum(t.ActualHoursPerService) over (partition by t.ClientID order by t.Ident desc rows unbounded preceding) HoursPerClient 
     ,* 
from @tbl t 
order by t.ClientID, t.Ident; 

あなたのCTEされるであろう(私は私のソース表のIdent列を作成していることがわかります。そうしないとジェームズのための行が順不同であることができ、その後、あなたは、各行で異なる実行中の合計を持っています。あなたは、おそらくServiceActualEndDateのようなものをパーティションステートメントで注文して、それを最終注文にも使用するべきです。

参考のため、ここでは合計を逆算してあなたが探していたものと一致する:link

これはあなたをそこに連れて行くのに十分です。

+0

詳細な回答をいただきありがとうございます。後でこれを試してみましょう。 – NHier1992

関連する問題