2011-10-10 5 views
5

Ho bisogno di confrontare i saldi finali di due tabelle di diversi client raggruppati per ID. Le tabelle hanno lo stesso ID ma una ha più voci ID e l'altra no. Ho bisogno di sommare la riga dalla tabella con più voci in modo da avere solo un numero finale con cui fare i calcoli.Come raggruppare per due campi di dati in un'espressione di tabella comune

Ho la query che fa questo molto, ma ora ho bisogno di farlo raggruppare per mese pure. La mia query corrente lo ammonta a tutte le date. I dati devono essere ordinati per ID e per mese in modo che conoscano il saldo mensile finale per ogni ID. C'è un modo per farlo con quello che ho finora?

Grazie in anticipo.

Questo è quello che ho finora.

-- Data setup 
    CREATE TABLE [Table1] 
    (
     [ID] INT, 
     [cost] INT, 
     [traceNumber] INT, 
     [TheDate] DATE 
    ) 

    INSERT [Table1] 
    VALUES (1, 200, 1001, '9/07/2011'), 
      (1, -20, 1002, '9/08/2011'), 
      (1, 130, 1003, '10/10/2011'), 
      (2, 300, 1005, '10/10/2011') 

    CREATE TABLE [Table2] 
    (
     [ID] INT, 
     [cost] INT 
    ) 

    INSERT [Table2] 
    VALUES (1, 200), 
      (2, 300) 

    -- Query 
    ;WITH [cteTable1Sum] AS 
    (
     SELECT [ID], SUM([cost]) AS [cost] 
     FROM [Table1] 
     GROUP BY [ID] 
    )  
    SELECT [Table1].[ID], 
      [Table1].[TheDate], 
      [Table1].[traceNumber], 
      [Table1].[cost] AS [Frost_Balance], 
      cte.[cost] AS [SUM_Frost_Balance], 
      [Table2].[cost] AS [Ternean_Balance], 
      cte.[cost] - [Table2].[cost] AS [Ending_Balance] 
    FROM [Table1] 
    INNER JOIN [Table2] 
     ON [Table1].[ID] = [Table2].[ID] 
    INNER JOIN [cteTable1Sum] cte 
     ON [Table1].[ID] = cte.[ID] 

Ho provato questo e ottengo la risposta sbagliata.

WITH [cteTable1Sum] AS 
     (SELECT [ID], SUM([cost]) 
     AS [cost] FROM [Table1] 
     GROUP BY [ID], [TheDate]) 

risposta

4

probabilmente si dovrebbe utilizzare i MONTH() e YEAR() funzioni per questo:

;WITH [cteTable1Sum] AS 
    (
     SELECT [ID], 
       MONTH(TheDate) as Mo, 
       YEAR(TheDate) as yr, 
       SUM([cost]) AS [cost] 
     FROM [Table1] 
     GROUP BY [ID], MONTH(TheDate), YEAR(TheDate) 
    )  

Questo vi darà la ripartizione mensile di ogni mese per ogni ID. Quindi cambia il tuo JOIN a:

INNER JOIN [cteTable1Sum] cte 
     ON [Table1].[ID] = cte.[ID] 
     AND MONTH(Table1.TheDate) = cte.Mo 
     AND YEAR(Table1.TheDate) = cte.Yr 
+0

Grazie, JNK, ha funzionato. – user973671

Problemi correlati