2017-11-22 2 views
0

データベースから請求書情報を引き出し、4つの異なる広告申込情報を合計して月別にグループ化するクエリを実行しています。このクエリは、JOINの3つのテーブル:CustomerAccount,InvoiceおよびInvoiceDetailを含む。クエリを実行すると正しい情報が得られますが、各列が1つの値を持つ4つの行に分割され、残りはNULLです。それらの行がすべて1つの行に表示されるように行を結合するにはどうすればよいですか?私がでてるSELECTサブクエリのSUMを結合し、NULLSを持つ行を結合する

| Account# | Branch | Department | Date | Name | Delvry | Storage | Ret/Ref | Shredding 
| 1000  | MAIN | TAX  | 2016-01 | Acme | $50.00 | $200.00 | $124.00 | $12.75 

:私はそれは次のようになりたい

| Account# | Branch | Department | Date | Name | Delvry | Storage | Ret/Ref | Shredding 
| 1000  | MAIN | TAX  | 2016-01 | Acme | $50.00 | NULL | NULL | NULL 
| 1000  | MAIN | TAX  | 2016-01 | Acme | NULL | $200.00 | NULL | NULL 
| 1000  | MAIN | TAX  | 2016-01 | Acme | NULL | NULL | $124.00 | NULL 
| 1000  | MAIN | TAX  | 2016-01 | Acme | NULL | NULL | NULL | $12.75 

SELECT 
    [Client].[CustID] AS [Account#], 
    [Client].[Branch] AS [Branch], 
    [Client].[Dept] AS [Department], 
    CONCAT(DATEPART(YEAR, [dbo].[Invoice].[Date]), '-', RIGHT('00' + CONVERT(NVARCHAR(2), DATEPART(MONTH, [dbo].[Invoice].[Date])), 2)) AS [Date], 
    [Client].[Name], 
    (SELECT FORMAT(SUM([InvDetail].[SubTotal]), 'C', 'en-us') WHERE [InvDetail].[Description] = 'Delivery/Pickup') AS [Dlvry], 
    (SELECT FORMAT(SUM([InvDetail].[SubTotal]), 'C', 'en-us') WHERE [InvDetail].[Description] = 'File Storage') AS [Storage], 
    (SELECT FORMAT(SUM([InvDetail].[SubTotal]), 'C', 'en-us') WHERE [InvDetail].[Description] = 'BOX RETRIEVAL' OR [InvDetail].[Description] = 'BOX RETFILE') AS [Ret/Ref], 
    (SELECT FORMAT(SUM([InvDetail].[SubTotal]), 'C', 'en-us') WHERE [InvDetail].[Description] LIKE 'Shredding%') AS [Shredding], 
    FORMAT(SUM([InvDetail].[SubTotal]), 'C', 'en-us') AS [SubTotal], 
    FORMAT(SUM([InvDetail].[GST]), 'C', 'en-us') AS [GST], 
    FORMAT(SUM([InvDetail].[PST]), 'C', 'en-us') AS [PST], 
    FORMAT(SUM([InvDetail].[Total]), 'C', 'en-us') AS [Total] 
FROM [dbo].[CustomerAccount] AS [Client] LEFT JOIN [dbo].[Invoice] 
    ON [Client].[CustID] = [dbo].[Invoice].[CustID] 
LEFT JOIN [dbo].[InvoiceDetail] AS [InvDetail] 
    ON [dbo].[Invoice].[InvoiceNumber] = [InvDetail].[InvoiceNumber] 

WHERE DATEPART(YEAR, [dbo].[Invoice].[Date]) >= 2015 
     AND DATEPART(YEAR, [dbo].[Invoice].[Date]) <= 2017 
     AND [Acct] = @ACCOUNT# 
     AND [Branch] = @BRANCH 
     AND [Dept] = @DEPARTMENT 
GROUP BY [Client].[CustID], 
     [Client].[Branch], 
     [Client].[Dept], 
     [Client].[Name], 
     DATEPART(YEAR, [dbo].[Invoice].[Date]), 
     DATEPART(MONTH, [dbo].[Invoice].[Date]), 
     [InvDetail].[Description] 

ORDER BY [Client].[CustID] 

クエリの結果は次のようになります。ここでは

は私のクエリですどのように進行するかについての損失。

+0

投稿したクエリ結果がクエリと一致しません。 – Squirrel

+0

を削除してください[dbo]。[InvoiceDetail]。[説明] 'GROUP BY – Squirrel

+2

から削除することをお勧めします。plz use [テーブルのエイリアス](https://www.w3schools.com/sql/sql_alias.asp) –

答えて

0

取得したクエリ結果が、IntermediateTableという名前のテーブルに格納されていることを考慮してください。必要な結果を得るためのクエリは次のようになります。

SELECT Account# 
     ,Branch 
     ,Department 
     ,Date 
     ,Name 
     ,SUM(ISNULL(Delvry,0)) 
     ,SUM(ISNULL(Storage,0)) 
     ,SUM(ISNULL(Ret/Ref,0)) 
     ,SUM(ISNULL(Shredding,0)) 
FROM IntermediateTable 
GROUP BY Account# 
     ,Branch 
     ,Department 
     ,Date 
     ,Name 
関連する問題