2017-07-19 83 views
0

我爲報表編寫了以下sql查詢。sql分組爲一列

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

,但我想要的輸出是在這裏

enter image description here

那麼,如何改變我的查詢需要的結果(分組到ACC和GL_ID )?

+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

包裹每個總和的case語句()和前三欄的@Siyual集團表示 – scsimon

回答

0

的快速和骯髒的方法是通過包裝,這會妨礙你的3,4,5,第六列有重複值的整個查詢和組。

的清潔方法是把這些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

此查詢結果same.I需要組到一行CASHCR,CASHDR,OTHERCR,OTHERDR爲同一個帳戶 –

+0

@ SandeepKumar,我已經對它進行了更新,但我沒有考慮到我不需要按照總計進行分組,因爲這樣可以將數字分開。 –