2017-07-19 9 views
0

次のSQLクエリでレポートを作成しました。SQLを1つの列にグルーピングする

Select AT.OTHER_GL_CODE As ACC, 
     GL.GL_ID, 
     GL.GL_NAME, 
     (Case When (
         AT.OTHER_TRN_DEC = 'Cash' 
         And AT.OTHER_CR_DR = 'CR' 
       ) Then AT.OTHER_AMOUNT 
      Else '0' 
     End 
     ) As 'CASHCR', 
     (Case When (
         AT.OTHER_TRN_DEC = 'Cash' 
         And AT.OTHER_CR_DR = 'DR' 
       ) Then AT.OTHER_AMOUNT 
      Else '0' 
     End 
     ) As 'CASHDR', 
     (Case When (
         AT.OTHER_TRN_DEC <> 'Cash' 
         And AT.OTHER_CR_DR = 'CR' 
       ) Then AT.OTHER_AMOUNT 
      Else '0' 
     End 
     ) As 'OTHERCR', 
     (Case When (
         AT.OTHER_TRN_DEC <> 'Cash' 
         And AT.OTHER_CR_DR = 'DR' 
       ) Then AT.OTHER_AMOUNT 
      Else '0' 
     End 
     ) As 'OTHERDR', 
     AT.OTHER_BRN_CODE BRNCODE, 
     (
      Select Sum( Case When TR.CR_DR = 'DR' 
            And TR.BRANCH_CODE = 1000 
            And TR.TRAN_DATE < '2017-07-01' Then TR.GL_TRN_AMT 
           Else 0 
         End 
        ) 
      From COREBANKER1.dbo.GL_DAILY_TRN As TR 
      Where TR.GL_CODE = AT.OTHER_GL_CODE 
     ) As DRBRFORE, 
     (
      Select Sum( Case When TR.CR_DR = 'CR' 
            And TR.BRANCH_CODE = 1000 
            And TR.TRAN_DATE < '2017-07-01' Then TR.GL_TRN_AMT 
           Else 0 
         End 
        ) 
      From COREBANKER1.dbo.GL_DAILY_TRN As TR 
      Where TR.GL_CODE = AT.OTHER_GL_CODE 
     ) As CRBRFORE 
From COREBANKER1.dbo.MAIN_OTHER_TRN As AT, 
     COREBANKER1.dbo.GL_MAIN As GL 
Where AT.OTHER_BRN_CODE = 1000 
     And GL.GL_ID = AT.OTHER_GL_CODE 
     And AT.OTHER_BANK_DATE 
     Between '2017-07-01' And '2017-07-30'; 

これは出力

enter image description here

ですが、私の所望の出力は、だから私は望ましい結果のために私のクエリを変更する方法(ACCとGL_IDにグループ化し、ここで

enter image description here

です)?

+4

最初にすべきことは、ANSI-92スタイルの結合を使用することです。これらの結合は25年以上前から行われています。 http://sqlblog.com/blogs/aaron_bertrand/archive/2009/10/08/bad-habits-to-kick-using-old-style-joins.aspx次に、人々が必要とする回答を提供できるようにするいくつかの詳細を提供する。ここから始めましょう。 http://spaghettidba.com/2015/04/24/how-to-post-at-sql-question-on-a-public-forum/ –

+2

あなたは 'GROUP BY'と' SUM() '集計... – Siyual

+0

最初の3つの列でsum()およびgroupを使用してcase文をそれぞれ@Siyualと表記します – scsimon

答えて

0

クイックで汚れたアプローチは、クエリとグループ全体を囲むことです。これは3,4,5,6列目の値が重複しないようにします。

より明確なアプローチは、これらの4つの列を取り、後の列の場合と同様にSelect SUM(...)で各列をラップすることです。

簡潔に言えば、GROUP BYには重複が残っていません。私はあなたに迅速で汚いアプローチの構文を与える自由を取っています。下記を参照してください。

SELECT 
    ACC 
    ,GL_ID 
    ,GL_NAME 
    ,SUM(CASHCR) AS CASHCR 
    ,SUM(CASHDR) AS CASHDR 
    ,SUM(OTHERCR) AS OTHERCR 
    ,SUM(OTHERDR) AS OTHERDR 
    ,BRNCODE 
    ,DRBRFORE 
    ,CRBRFORE 
FROM (
    Select AT.OTHER_GL_CODE As ACC, 
      GL.GL_ID, 
      GL.GL_NAME, 
      (Case When (
          AT.OTHER_TRN_DEC = 'Cash' 
          And AT.OTHER_CR_DR = 'CR' 
        ) Then AT.OTHER_AMOUNT 
       Else '0' 
      End 
      ) As 'CASHCR', 
      (Case When (
          AT.OTHER_TRN_DEC = 'Cash' 
          And AT.OTHER_CR_DR = 'DR' 
        ) Then AT.OTHER_AMOUNT 
       Else '0' 
      End 
      ) As 'CASHDR', 
      (Case When (
          AT.OTHER_TRN_DEC <> 'Cash' 
          And AT.OTHER_CR_DR = 'CR' 
        ) Then AT.OTHER_AMOUNT 
       Else '0' 
      End 
      ) As 'OTHERCR', 
      (Case When (
          AT.OTHER_TRN_DEC <> 'Cash' 
          And AT.OTHER_CR_DR = 'DR' 
        ) Then AT.OTHER_AMOUNT 
       Else '0' 
      End 
      ) As 'OTHERDR', 
      AT.OTHER_BRN_CODE BRNCODE, 
      (
       Select Sum( Case When TR.CR_DR = 'DR' 
             And TR.BRANCH_CODE = 1000 
             And TR.TRAN_DATE < '2017-07-01' Then TR.GL_TRN_AMT 
            Else 0 
          End 
         ) 
       From COREBANKER1.dbo.GL_DAILY_TRN As TR 
       Where TR.GL_CODE = AT.OTHER_GL_CODE 
      ) As DRBRFORE, 
      (
       Select Sum( Case When TR.CR_DR = 'CR' 
             And TR.BRANCH_CODE = 1000 
             And TR.TRAN_DATE < '2017-07-01' Then TR.GL_TRN_AMT 
            Else 0 
          End 
         ) 
       From COREBANKER1.dbo.GL_DAILY_TRN As TR 
       Where TR.GL_CODE = AT.OTHER_GL_CODE 
      ) As CRBRFORE 
    From COREBANKER1.dbo.MAIN_OTHER_TRN As AT, 
      COREBANKER1.dbo.GL_MAIN As GL 
    Where AT.OTHER_BRN_CODE = 1000 
      And GL.GL_ID = AT.OTHER_GL_CODE 
      And AT.OTHER_BANK_DATE 
      Between '2017-07-01' And '2017-07-30' 
)A 
GROUP BY 
    ACC 
    ,GL_ID 
    ,GL_NAME 
    ,CASHCR 
    ,CASHDR 
    ,OTHERCR 
    ,OTHERDR 
    ,BRNCODE 
    ,DRBRFORE 
    ,CRBRFORE 
      ; 
+0

このクエリ結果は同じです... –

+0

共有のいずれかでいくつかのサンプルデータを投稿してみてくださいサイトを開き、ここでリンクを共有してください。例:http://sqlfiddle.com/とhttps://www.db-fiddle.com/ – Eli

0

クエリをCTEで囲み、必要なフィールドを集計することができます。

WITH this as 
(
Select AT.OTHER_GL_CODE As ACC, 
    GL.GL_ID, 
    GL.GL_NAME, 
    (Case When (
        AT.OTHER_TRN_DEC = 'Cash' 
        And AT.OTHER_CR_DR = 'CR' 
      ) Then AT.OTHER_AMOUNT 
     Else '0' 
    End 
    ) As 'CASHCR', 
    (Case When (
        AT.OTHER_TRN_DEC = 'Cash' 
        And AT.OTHER_CR_DR = 'DR' 
      ) Then AT.OTHER_AMOUNT 
     Else '0' 
    End 
    ) As 'CASHDR', 
    (Case When (
        AT.OTHER_TRN_DEC <> 'Cash' 
        And AT.OTHER_CR_DR = 'CR' 
      ) Then AT.OTHER_AMOUNT 
     Else '0' 
    End 
    ) As 'OTHERCR', 
    (Case When (
        AT.OTHER_TRN_DEC <> 'Cash' 
        And AT.OTHER_CR_DR = 'DR' 
      ) Then AT.OTHER_AMOUNT 
     Else '0' 
    End 
    ) As 'OTHERDR', 
    AT.OTHER_BRN_CODE BRNCODE, 
    (
     Select Sum( Case When TR.CR_DR = 'DR' 
           And TR.BRANCH_CODE = 1000 
           And TR.TRAN_DATE < '2017-07-01' Then TR.GL_TRN_AMT 
          Else 0 
        End 
       ) 
     From COREBANKER1.dbo.GL_DAILY_TRN As TR 
     Where TR.GL_CODE = AT.OTHER_GL_CODE 
    ) As DRBRFORE, 
    (
     Select Sum( Case When TR.CR_DR = 'CR' 
           And TR.BRANCH_CODE = 1000 
           And TR.TRAN_DATE < '2017-07-01' Then TR.GL_TRN_AMT 
          Else 0 
        End 
       ) 
     From COREBANKER1.dbo.GL_DAILY_TRN As TR 
     Where TR.GL_CODE = AT.OTHER_GL_CODE 
    ) As CRBRFORE 
From COREBANKER1.dbo.MAIN_OTHER_TRN As AT, 
    COREBANKER1.dbo.GL_MAIN As GL 
Where AT.OTHER_BRN_CODE = 1000 
    And GL.GL_ID = AT.OTHER_GL_CODE 
    And AT.OTHER_BANK_DATE 
    Between '2017-07-01' And '2017-07-30'; 
) 
) 
SELECT ACC ,GL_ID ,GL_NAME, SUM(CASHCR) AS CASHCR ,SUM(CASHDR) AS CASHDR ,SUM(OTHERCR) AS OTHERCR ,SUM(OTHERDR) AS OTHERDR, BRNCODE, DRBRFORE, CRBRFORE 
FROM this 
GROUP BY ACC ,GL_ID ,GL_NAME /*,CASHCR ,CASHDR ,OTHERCR ,OTHERDR */,BRNCODE 
,DRBRFORE ,CRBRFORE 
+0

このクエリの結果は同じです。同じ口座に対してCASHCR、CASHDR、OTHERCR、OTHERDRのいずれかの行にグループ化する必要があります –

+0

@ SandeepKumar、私はそれを更新しました、私は集計でグループ化する必要はなかったことを考慮していませんでした。 –

関連する問題