Каков наилучший способ вернуть объединенный столбец с неагрегированным столбцом в наборе результатов представления - PullRequest
0 голосов
/ 30 сентября 2011

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

Table1:

ID,    cost,    traceNumber,   TheDate
1,     200,     1001,          10/07/2011
1,     -20,     1002,          10/08/2011
1,     130,     1003,          10/10/2011
2,     300,     1005,          10/10/2011

Table2:

ID,    cost
1,     200
2,     300

Результат для ID 1 будет равен 310 по сравнению с таблицей 2 из 200 с разницей в 110

Запрос будет выглядеть примерно так.

SELECT DISTINCT
    Table1.ID,
    Table1.TheDate ,
    Table1.traceNumber,
    Table1.[cost] AS Frost_Balance, 
    SUM(Table1.[cost]) AS SUM_Frost_Balance, 
    Table2.[cost] AS Ternean_Balance, 
    SUM(Table1.[cost]) - Table2.[cost] AS Ending_Balance, 
FROM  
    Table1 
    INNER JOIN Table2 ON Table1.ID =Table2.CustomerID 
GROUP BY 
    dbo.Frost.ID

Запрос должен отображать несколько столбцов в наборе результатов, поскольку он будет использоваться для составления отчета. Я попытался сгруппировать по всем столбцам в наборе результатов, но это дало мне неправильные результаты. Есть ли другой способ вычислить столбец, который нужно суммировать?

Ответы [ 2 ]

1 голос
/ 01 октября 2011

Вы можете использовать «функцию агрегирования окон», например:

select 
    table1.*,
    sum(table1.cost) over (partition by table1.id) sum_frost_balance,
    table2.cost,
    sum(table1.cost) over (partition by table1.id) - table2.cost ending_balance
from table1
    join table2 on table1.id = table2.id
0 голосов
/ 30 сентября 2011

Это то, что вы пытаетесь сделать?

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

INSERT [Table1]
VALUES  (1, 200, 1001, '10/07/2011'),
        (1, -20, 1002, '10/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]
...