【问题标题】:Copying data in temporary table in sql在sql中复制临时表中的数据
【发布时间】:2015-01-07 20:46:08
【问题描述】:

我想从其他表中复制临时数据中的数据...

CREATE TABLE #temp1 (
    Question_ID INT
    ,Excellent INT
    ,Good INT
    ,Average INT
    ,Below_Average INT
    ,Poor INT
    )

INSERT INTO #temp1
VALUES (
    (
        SELECT Question_ID
        FROM Eval
        GROUP BY Question_ID
        )
    ,(
        SELECT COUNT(Answer_Marks) AS "Excellent"
        FROM Eval
        WHERE Answer_Marks = 5
            AND Emp_no = 'biit218'
        GROUP BY Question_ID
        )
    ,(
        SELECT COUNT(Answer_Marks) AS "Good"
        FROM Eval
        WHERE Answer_Marks = 4
            AND Emp_no = 'biit218'
        GROUP BY Question_ID
        )
    ,(
        SELECT COUNT(Answer_Marks) AS "Average"
        FROM Eval
        WHERE Answer_Marks = 3
            AND Emp_no = 'biit218'
        GROUP BY Question_ID
        )
    ,(
        SELECT COUNT(Answer_Marks) AS "Baverage"
        FROM Eval
        WHERE Answer_Marks = 2
            AND Emp_no = 'biit218'
        GROUP BY Question_ID
        )
    ,(
        SELECT COUNT(Answer_Marks) AS "poor"
        FROM Eval
        WHERE Answer_Marks = 1
            AND Emp_no = 'biit218'
        GROUP BY Question_ID
        )
    )

每个子查询应该复制临时表中的 15 条记录,但它返回错误:

消息 512,第 16 级,状态 1,第 1 行
子查询返回超过 1 个值。当子查询跟随 =、!=、、>= 或子查询用作表达式时,这是不允许的。声明已终止。

【问题讨论】:

  • 请重新格式化您的问题!
  • 这是因为您的每个子查询都返回多行。

标签: sql sql-server


【解决方案1】:

您需要使用INSERT INTO ... SELECT .. FROM 来执行插入操作。您当前的语法将不起作用,因为您试图将多行插入到单个列中。如果您使用这样的子查询,它应该只为所有行返回一个值。我建议使用一些带有聚合函数的条件逻辑来获取类似于以下内容的每一列:

INSERT INTO #temp1
SELECT 
    Question_ID,
    sum(case when Answer_Marks = 5 then 1 else 0 end) as Excellent,
    sum(case when Answer_Marks = 4 then 1 else 0 end) as Good,
    sum(case when Answer_Marks = 3 then 1 else 0 end) as Average,
    sum(case when Answer_Marks = 2 then 1 else 0 end) as Baverage,
    sum(case when Answer_Marks = 1 then 1 else 0 end) as Poor
FROM Eval
WHERE Emp_no = 'biit218'
GROUP BY Question_ID

【讨论】:

    【解决方案2】:

    你需要使用insert into select语法

    insert into #temp1
    select question_id,
           count( case when Answer_Marks = 5 then 1 end ) as Excellent,
           count( case when Answer_Marks = 4 then 1 end ) as Good,
           count( case when Answer_Marks = 3 then 1 end ) as Average,
           count( case when Answer_Marks = 2 then 1 end ) as Baverage,
           count( case when Answer_Marks = 1 then 1 end ) as Poor
    from Eval
    where Emp_no ='biit218' and Answer_Marks between 1 and 5
    group by Question_ID
    

    【讨论】:

      【解决方案3】:

      删除“值”关键字

      INSERT INTO #temp1 SELECT ( SELECT Question_ID FROM Eval GROUP BY Question_ID ) ,( SELECT COUNT(Answer_Marks) AS "Excellent" FROM Eval WHERE Answer_Marks = 5 AND Emp_no = 'biit218' GROUP BY Question_ID ) ,( SELECT COUNT(Answer_Marks) AS "Good" FROM Eval WHERE Answer_Marks = 4 AND Emp_no = 'biit218' GROUP BY Question_ID ) ,( SELECT COUNT(Answer_Marks) AS "Average" FROM Eval WHERE Answer_Marks = 3 AND Emp_no = 'biit218' GROUP BY Question_ID ) ,( SELECT COUNT(Answer_Marks) AS "Baverage" FROM Eval WHERE Answer_Marks = 2 AND Emp_no = 'biit218' GROUP BY Question_ID ) ,( SELECT COUNT(Answer_Marks) AS "poor" FROM Eval WHERE Answer_Marks = 1 AND Emp_no = 'biit218' GROUP BY Question_ID )

      【讨论】:

      • 这行不通。每列都有多行。
      猜你喜欢
      • 1970-01-01
      • 2011-01-29
      • 1970-01-01
      • 1970-01-01
      • 2014-02-13
      • 2017-04-20
      • 1970-01-01
      • 2013-12-30
      • 2013-01-17
      相关资源
      最近更新 更多