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

Я пытаюсь написать это в одном запросе.Как я могу это сделать?

В основном мне нужно это ежемесячно, поэтому я не могу написать это 30 раз.Любой возможный способ добиться, пожалуйста, поделитесь.В следующем запросе один и тот же код написан 3 раза, но с другим параметром даты.

Select  
case when Cast(ILE.[Posting Date] as date) <  Cast(Getdate() as date)  then cast(ILE.Quantity as Numeric(19,6)) else 0 end AS [Opening],
case when Cast(ILE.[Posting Date] as date) <=  Cast(Getdate() as date)  then cast(ILE.Quantity as Numeric(19,6)) else 0 end AS [Closing]
from  [Item Ledger Entry] ILE
where Cast(ILE.[Posting Date] as date) <= Cast(Getdate() as date)

Union all

Select  
case when Cast(ILE.[Posting Date] as date) <  Cast(Getdate()-1 as date)  then cast(ILE.Quantity as Numeric(19,6)) else 0 end AS [Opening],
case when Cast(ILE.[Posting Date] as date) <=  Cast(Getdate()-1 as date)  then cast(ILE.Quantity as Numeric(19,6)) else 0 end AS [Closing]
from [Item Ledger Entry] ILE
where Cast(ILE.[Posting Date] as date) <= Cast(Getdate()-1 as date)

union all

Select  
case when Cast(ILE.[Posting Date] as date) <  Cast(Getdate()-2 as date)  then cast(ILE.Quantity as Numeric(19,6)) else 0 end AS [Opening],
case when Cast(ILE.[Posting Date] as date) <=  Cast(Getdate()-2 as date)  then cast(ILE.Quantity as Numeric(19,6)) else 0 end AS [Closing]
from [Item Ledger Entry] ILE
where Cast(ILE.[Posting Date] as date) <= Cast(Getdate()-2 as date)

Данные будут выглядеть следующим образом на изображении ниже. При использовании запроса выше https://i.stack.imgur.com/Hc6Co.png

Ответы [ 2 ]

0 голосов
/ 30 января 2019

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

DECLARE @DaysPast TABLE(
    Diff SMALLINT
)
DECLARE @MaxDaysPast SMALLINT=30;

WITH DaysPast(Diff) AS   
(  
    SELECT 0
    UNION ALL  
    SELECT Diff+1
    FROM DaysPast
    WHERE Diff<=@MaxDaysPast
)
INSERT INTO @DaysPast(Diff)
    SELECT *  
    FROM DaysPast  
    WHERE Diff<=@MaxDaysPast;

Select  
    case
        when Cast(ILE.[Posting Date] as date) <  Cast(DATEADD(DAYS,-1*dp.Diff,Getdate() as date)  then cast(ILE.Quantity as Numeric(19,6))
        else 0
    end AS [Opening],
    case
        when Cast(ILE.[Posting Date] as date) <=  Cast(DATEADD(DAYS,-1*dp.Diff,Getdate() as date)  then cast(ILE.Quantity as Numeric(19,6))
        else 0
    end AS [Closing]
from  [Item Ledger Entry] ILE
inner join @DaysPast dp ON Cast(ILE.[Posting Date] as date) <= Cast(DATEADD(DAYS,-1*dp.Diff,Getdate() as date)
0 голосов
/ 30 января 2019

Почему бы вам не использовать КОНВЕРТ (VARCHAR (7), ILE. [Дата публикации], 120), где вы группируете это по этому месяцу, если вам нужно днем, вы бы изменили varchar (7) наVARCHAR (10).Удалите объединения и просто напишите базовый агрегированный запрос.

Примечание: Вы также можете использовать это в выбранном разделе в вашей группе по разделам, с полями, которыевы хотите, чтобы разбивка давала правильную разбивку.

Случай, когда и ваша логика диапазона также должны будут измениться.

...