Как сгруппировать по двум полям данных в общем табличном выражении - PullRequest
5 голосов
/ 10 октября 2011

Мне нужно сравнить итоговые остатки двух таблиц от разных клиентов, сгруппированных по ID.Таблицы имеют одинаковые идентификаторы, но одна имеет несколько записей идентификаторов, а другая - нет.Мне нужно сложить строку из таблицы с несколькими записями, поэтому у меня есть только одно окончательное число для расчетов.

У меня есть запрос, который делает это много, но теперь мне нужно получить его для группировки по месяцам, так какЧто ж.Мой текущий запрос суммирует его на все даты.Данные должны быть отсортированы по идентификатору и месяцу, чтобы они знали конечный ежемесячный баланс для каждого идентификатораЕсть ли способ сделать это с тем, что у меня до сих пор?

Заранее спасибо.

Это то, что у меня есть до сих пор.

    -- 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]

Я пробовал этои я получаю неправильный ответ.

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

1 Ответ

4 голосов
/ 10 октября 2011

Для этого вам, вероятно, следует использовать функции MONTH() и YEAR():

;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)
    )       

Это даст вам месячную разбивку каждого месяца для каждого удостоверения личности. Затем измените JOIN на:

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