Союз ВСЕ с разделом - PullRequest
       10

Союз ВСЕ с разделом

0 голосов
/ 11 мая 2019

У меня есть два отдельных запроса, и я хочу объединить их в один.сами по себе они работают нормально, я пытался использовать union, но я не могу понять, как это правильно.По сути, один запрос получает баланс на определенную дату, а другой - расчет активности для диапазона дат.Я хочу, чтобы результаты отображались в столбцах рядом друг с другом.

Пробная запись запроса без разбиения и в виде простой группировки по.использовал объединение, но тогда я не могу получить столбцы для второго запроса, чтобы появиться в главном операторе выбора.

Declare @Date datetime = '04/01/2019'

Код для начального баланса:

    Select Left(Account,4)Entity, right(Account,9)Account, sum(debit+credit)BBal
From GLT_CURRENT__TRANSACTION 
Where Left(Account,4) = '9452'  and 
Right(Account,9) IN ('1110.0130','1110.0131','2110.0061','2110.0062') 
and Accounting_Date <= EOMONTH('04-01-2019',-1)
Group By Left(Account,4), right(Account,9)

Код для суммы активности

    Select Left(Account,4)Entity,Right(Account,9),Sum(debit+credit)Activity
From GLT_CURRENT__TRANSACTION AS A Where 
Left(Account,4) = '9452' and Accounting_Date >= '04-01-2019' and Accounting_Date <= Eomonth('04-01-2019')
AND Right(Account,9) IN ('1110.0130','1110.0131','2110.0061','2110.0062')
Group By Left(Account,4), Right(Account,9)

Как объединить два в одном ряду?Пробовал объединение, но не работал на втором запросе.

Entity   Account  BBalance Activity
  9452 1110.0130     50.00    2,500

Ответы [ 3 ]

1 голос
/ 11 мая 2019

Другой простой способ сделать это - использовать CTE.Код основан на вашем начальном балансе и запросах движения выше.

DECLARE @Date DATETIME = '04/01/2019' --Set the variable for the first day of the period.

;with BeginningBalance
as
( 
    --Gather the beginning or opening balance
    Select 
        Left(Account,4) as Entity, 
        right(Account,9) as Account, 
        sum(debit+credit) as BBal
    From 
        GLT_CURRENT__TRANSACTION 
    Where 
        Left(Account,4) = '9452'  and 
        Right(Account,9) IN ('1110.0130','1110.0131','2110.0061','2110.0062')  and
        Accounting_Date <= EOMONTH(@Date,-1) --All transaction movement up until 31Mar
    Group By 
        Left(Account,4), 
        right(Account,9)
),
Activity --Activity / movement
as
(
    Select 
        Left(Account,4) as Entity,
        Right(Account,9) as Account,
        Sum(debit+credit)Activity
    From 
        GLT_CURRENT__TRANSACTION  
    Where 
        Left(Account,4) = '9452' and 
        Accounting_Date >= @Date and 
        Accounting_Date <= Eomonth(@Date) AND 
        Right(Account,9) IN ('1110.0130','1110.0131','2110.0061','2110.0062')
    Group By 
        Left(Account,4), 
        Right(Account,9)
)
SELECT 
    ISNULL(a.Entity, b.Entity) as [Entity], --Use entity from Beginning or activity just in case the account was made on or after 1APR or not used after 31Mar
    ISNULL(a.Account, b.Account) as [Account], --Use Account from Beginning or activity just in case the account was made on or after 1APR or not used after 31Mar
    ISNULL(BBal,0) as [BBal], --Zero opening if there is no opening balance
    ISNULL(Activity,0) as [Activity] --Zero activity if there is no account movement within the period
FROM 
    BeginningBalance a
FULL OUTER JOIN --Should include all rows from beginning balance & activity. You may want to exclude inactive accounts with zero balances as you're summing up values since the start of your GL
    Activity b
ON 
    a.Entity = b.Entity AND
    a.Account = b.Account
1 голос
/ 11 мая 2019

Я думаю, что вы слишком усложняете вещи

SELECT
    LEFT(Account,4) as Entity, 
    RIGHT(Account,9) as Account, 
    SUM(CASE WHEN accounting_date <= EOMONTH(@date, -1) THEN debit+credit END) as BBal,
    SUM(CASE WHEN accounting_date > EOMONTH(@date, -1) THEN debit+credit END) as Activity
FROM
    GLT_CURRENT__TRANSACTION 
WHERE
    Left(Account,4) = '9452'  and 
    Right(Account,9) IN ('1110.0130','1110.0131','2110.0061','2110.0062')  and
    Accounting_Date <= EOMONTH(@Date) 
GROUP BY 
    Left(Account,4), 
    right(Account,9)

Этот запрос, когда ему присваивается @date, например 14 марта 2018 года, выбирает все транзакции до 31 марта 2018 года.Для каждой строки CASE WHEN внутри SUM проверяет, является ли отчетная дата прошлым (для ббал) или текущим месяцем (для активности).Если учетная дата для конкретной транзакции не соответствует правилу CASE WHEN, тест возвращает false), тогда возвращаемое значение из CASE WHEN равно нулю, поэтому оно не суммируется

Чтобы понять, как работает этот запрос, запустите его без группировки / суммирования:

SELECT
    LEFT(Account,4) as Entity, 
    RIGHT(Account,9) as Account, 
    Accounting_date,
    (CASE WHEN accounting_date <= EOMONTH(@date, -1) THEN debit+credit END) as BBal,
    (CASE WHEN accounting_date > EOMONTH(@date, -1) THEN debit+credit END) as Activity
FROM
    GLT_CURRENT__TRANSACTION 
WHERE
    Left(Account,4) = '9452'  and 
    Right(Account,9) IN ('1110.0130','1110.0131','2110.0061','2110.0062')  and
    Accounting_Date <= EOMONTH(@Date)   

Транзакции будут такими же для @date в марте:

1, 1, 02-Feb-18, $100, null --previous month
1, 1, 28-Feb-18, $300, null --previous month
1, 1, 02-Mar-18, null, $400 --current month
1, 1, 28-Mar-18, null, $500 --current month

Посмотрите, как происходит случай, когда сумма транзакции разбивается настолбец bbal или деятельности в зависимости от отчетной даты?Теперь, когда мы суммируем их и группируем (удаляем столбец даты из результатов запроса):

1, 1, $400, $900  --the $400 is £100+$300, the $900 is $400+$500
0 голосов
/ 11 мая 2019

Попробуйте это-

DECLARE @Date DATETIME = '04/01/2019'

SELECT  
A.Entity, 
A.Account,
SUM(A.BBalance) BBalance,
SUM(A.Activity) Activity
FROM
(
    SELECT LEFT(Account,4)Entity, 
    RIGHT(Account,9)Account,
    CAST(SUM(debit+Credit) OVER ( PARTITION BY Right(Account,9)) AS NUMERIC(8,2)) As BBalance,
    0 Activity
    FROM GLT_CURRENT__TRANSACTION 
    WHERE LEFT(Account,4) = '9452'  
    AND RIGHT(Account,9) IN ('1110.0130','1110.0131','2110.0061','2110.0062') 
    AND Accounting_Date <= EOMONTH(@Date,-1) As D
    GROUP BY Entity, D.Account, BBalance
    --ORDER BY Account

    UNION ALL

    SELECT LEFT(Account,4)Entity,
    RIGHT(Account,9),
    0 BBalance,
    SUM(debit+credit)Activity
    FROM GLT_CURRENT__TRANSACTION 
    WHERE LEFT(Account,4) = '9452' 
    AND Accounting_Date >= @Date 
    AND Accounting_Date <= Eomonth(@Date)
    AND RIGHT(Account,9) IN ('1110.0130','1110.0131','2110.0061','2110.0062')
    Group By LEFT(Account,4), RIGHT(Account,9)
)A
GROUP BY A.Entity,A.Account
...