【问题标题】:Trying to get many SQL results into a single table试图将许多 SQL 结果放入一个表中
【发布时间】:2020-01-09 16:59:13
【问题描述】:

我有一个生成许多单独结果的 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

【问题讨论】:

    标签: sql sql-server temp-tables


    【解决方案1】:

    您似乎想了解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);
    

    也不要像以前那样在datetimes 上使用BETWEEN。您可能会丢失数据,因为不再包含第二个操作数的 00:00 点之后的任何数据。以&lt; 和次日 00:00 为边界。

    【讨论】:

    • 谢谢,小费,我通常从不使用。现在我会记住你的笔记。再次感谢。
    【解决方案2】:

    尝试在脚本开始时创建一个临时表,并在 WHILE 循环中插入该临时表,然后在结束时从中选择

    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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-11
      • 2018-08-16
      • 2022-06-24
      • 2013-04-27
      • 1970-01-01
      相关资源
      最近更新 更多