关键字SELECT附近的语法不正确

时间:2017-01-01 12:19:51

标签: sql sql-server tsql insert-into

我尝试按小时对我的购买进行分组。在这种情况下,我在数小时内没有任何购买。我想检查选择查询,如果一小时( 0 1 2 .... 22 23 )不存在于选择查询中:将具有默认值的记录添加到@Table。我得到这个错误:

  

关键字SELECT

附近的语法不正确

我该如何解决这个问题?

    DECLARE @Table AS TABLE (Price DECIMAL, NumberOfPhurchase INT, Hour INT);
    DECLARE @i AS INT = 0;
    DECLARE @j AS INT = 0;

    INSERT INTO @Table (Price,NumberOfPhurchase,Hour)
    VALUES
      (
        SELECT SUM(p.Price)    ,
           COUNT(p.Price)  ,
           DATEPART(HOUR, p.IssueDate)
    FROM   dbo.Payments    AS p
    WHERE  p.[state] = 6
           AND p.Transactionsuccess = 1
           AND (p.ReserveType = @ReserveType OR @ReserveType = 0)
           AND p.IssueDate >= @StartDate
           AND p.IssueDate <= @EndDate
    GROUP BY
           DATEPART(HOUR, p.IssueDate)

      )


    WHILE @i <= 23
    BEGIN
        SET @j =  
        SELECT COUNT(*) FROM @Table 
        WHERE  @Table.Hour = @i;
        IF @j = 0
        BEGIN
            INSERT INTO @Table
              (
                Price,
                NumberOfPhurchase,
                Hour
              )
            VALUES
              (
                0,
                0,
                @j
              )
        END
        SET @i=@i+1;
    END
    SELECT
        @Table.Price,
        @Table.NumberOfPhurchase,
        @Table.Hour
    FROM
        @Table

4 个答案:

答案 0 :(得分:3)

只需删除单词VALUES

即可
INSERT INTO @Table (Price,NumberOfPhurchase,Hour)
    SELECT SUM(p.Price)    ,
       COUNT(p.Price)  ,
       DATEPART(HOUR, p.IssueDate)
    FROM   dbo.Payments    AS p
    WHERE  p.[state] = 6
       AND p.Transactionsuccess = 1
       AND (p.ReserveType = @ReserveType OR @ReserveType = 0)
       AND p.IssueDate >= @StartDate
       AND p.IssueDate <= @EndDate
    GROUP BY
       DATEPART(HOUR, p.IssueDate)

您可以使用另一个INSERT .. SELECT语句填充零值:

  WHILE @i <= 23
  BEGIN
       INSERT INTO @Table(Price,NumberOfPhurchase,Hour)
       SELECT  0,0,@i
       WHERE @i NOT IN (SELECT Hour FROM @Table)
       SET @i=@i+1
  END

答案 1 :(得分:2)

为了完整起见,这是一个非程序性的解决方案。如果您打算使用数据库,至少应该了解我在这里做的事情:

INSERT INTO @Table (Price,NumberOfPurchase,Hour)
SELECT ISNULL(SUM(p.Price),0)    ,
       ISNULL(COUNT(p.Price),0)  ,
       H.HourNumber
FROM   
(
VALUES
(0),(1),(2),(3),(4),(5),(6),(7),(8),(9),(10),(11),(12),
(13),(14),(15),(16),(17),(18),(19),(20),(21),(22),(23)
) H (HourNumber)
LEFT OUTER JOIN dbo.Payments    AS p
ON H.HourNumber = DATEPART(HOUR, p.IssueDate)
AND p.[state] = 6
AND p.Transactionsuccess = 1
AND (p.ReserveType = @ReserveType OR @ReserveType = 0)
AND p.IssueDate >= @StartDate
AND p.IssueDate <= @EndDate
GROUP BY
DATEPART(HOUR, p.IssueDate)

答案 2 :(得分:1)

如果这是TSQL,那么而不是

SET @j =  
SELECT COUNT(*) FROM @Table

尝试:

SELECT @j = COUNT(*) FROM @Table 

答案 3 :(得分:0)

我能够使用下面的代码(SQL Server 2016):

    DECLARE @Table AS TABLE (Price DECIMAL, NumberOfPhurchase INT, Hour INT);
    DECLARE @i AS INT = 0;
    DECLARE @j AS INT = 0; 

    INSERT INTO @Table (Price,NumberOfPhurchase,Hour)
    SELECT SUM(p.Price)    ,
           COUNT(p.Price)  ,
           DATEPART(HOUR, p.IssueDate)
    FROM   dbo.Payments    AS p
    WHERE  p.[state] = 6
           AND p.Transactionsuccess = 1
           AND (p.ReserveType = @ReserveType OR @ReserveType = 0)
           AND p.IssueDate >= @StartDate
           AND p.IssueDate <= @EndDate
    GROUP BY
           DATEPART(HOUR, p.IssueDate)

    WHILE @i <= 23
    BEGIN
        SELECT @j =  
         COUNT(*) FROM @Table 
        WHERE  Hour = @i;
        IF @j = 0
        BEGIN
            INSERT INTO @Table
              (
                Price,
                NumberOfPhurchase,
                Hour
              )
            VALUES
              (
                0,
                0,
                @j
              )
        END
        SET @i=@i+1;
    END
    SELECT
       Price,
       NumberOfPhurchase,
       Hour
    FROM
        @Table
相关问题