Попытка получить множество SQL результатов в одной таблице - PullRequest
0 голосов
/ 09 января 2020

У меня есть оператор SQL, который генерирует много отдельных результатов. Мне нужно посмотреть, как сделать один набор результатов.

DECLARE @Table TABLE (Col1 INT, Col2 DATETIME) 
DECLARE @StartDT DATETIME 

SET @StartDT =  '20160101'

WHILE @StartDT < '20200201' 
BEGIN   
    SELECT 
        @StartDT AS [Month], 
        SUM([OrderTotal]) AS [Months Order Total]   
    FROM 
        [dbo].[tb_Order]   
    WHERE
        ApplicationId = '24b48d78-1fb8-4842-af6d-11c58e940700' 
        AND OrderStatusId IN (10, 20, 30)
        AND OrderDate BETWEEN @StartDT AND DATEADD(MONTH, 1, @StartDT)

    --SELECT COUNT(*) FROM @Table WHERE Col2 >= @StartDT AND Col2 < DATEADD(MONTH,1,@StartDT)   SET @StartDT = DATEADD(MONTH,1,@StartDT)
END

result

Ответы [ 2 ]

2 голосов
/ 09 января 2020

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

SELECT concat(year(orderdate),
              month(orderdate),
              '01') month,
       sum(ordertotal) ordertotal
       FROM dbo.tb_order
       WHERE applicationid = '24b48d78-1fb8-4842-af6d-11c58e940700'
             AND orderstatusid IN (10,
                                   20,
                                   30)
             AND orderdate >= '20160101'
             AND orderdate < '20200301'
       GROUP BY year(orderdate),
                month(orderdate)
       ORDER BY year(orderdate),
                month(orderdate);

Также не используйте BETWEEN на datetime с, как вы. Вы можете потерять данные, поскольку после 00:00 часов второго операнда больше нет. Используйте < и следующий день в 00:00 в качестве границы.

0 голосов
/ 09 января 2020

Попробуйте создать временную таблицу в начале вашего скрипта и вставьте в нее таблицу WHILE l oop, а затем ВЫБЕРИТЕ из нее в конце

CREATE TABLE #Month
(
    Month AS DATETIME,
    MonthsOrderTotal AS DECIMAL (8,2) -- or whatever your data type should be
)

DECLARE @Table TABLE (Col1 INT, Col2 DATETIME)
DECLARE @StartDT DATETIME SET @StartDT =  '20160101'

WHILE @StartDT < '20200201' BEGIN   

    INSERT INTO #Month
    SELECT  @StartDT as [Month],
            sum ([OrderTotal]) as [Months Order Total]
    FROM    [dbo].[tb_Order]
    WHERE   ApplicationId = '24b48d78-1fb8-4842-af6d-11c58e940700' AND
            OrderStatusId in (10,20,30) AND
            orderdate between @StartDT AND
            DATEADD(MONTH,1,@StartDT)

    SET @StartDT = DATEADD(MONTH,1,@StartDT)
END

SELECT  Month,
        MonthsOrderTotal
FROM    #Month

DROP TABLE #Month
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...