2012-02-07 63 views
3

table与来自其他表值更新列中,不能使用不同的函数

我的原始数据是表2中。我从头创建了Table1。我填充列A是这样的:

INSERT INTO Table1("item") 
SELECT DISTINCT(Table2."item") 
FROM Table2 

我填充Table1.Totals(列B)是这样的:

UPDATE Table1 
SET totals = t2.q 
    FROM Table1 INNER JOIN 
    (
     SELECT t2."item" 
     , SUM(t2.quantity) AS q 
     FROM t2 
     GROUP BY t2."item" 
    ) AS t2 
    ON Table1."item" = t2."item" 

我怎么能填充表1 “约会”?上面的我的更新不起作用,因为我不能在日期使用聚合函数。我能得到我使用一个单独的查询下面的代码想要的结果:

SELECT DISTINCT Table1."item" 
, Table2."date" 
FROM Table1 INNER JOIN Table2 
ON Table1."item" = Table2."item" 
ORDER BY Table1."item" 

可是我怎么用这个查询的结果来设置列的值?我使用的是SQL Server 2008的

+0

你应该选择什么样的日期,如果有一个以上的?你为什么不能在一个日期列使用聚合功能? – Lamak 2012-02-07 18:50:04

+0

你需要解释你想要的日期。在T-SQL中没有ANY()或ARBITRARY()函数。如果Orange有两个不同的日期会发生什么? – 2012-02-07 18:54:37

+0

另外,请不要在列名称周围加双引号。使其很难阅读,并且还依赖于QUOTED_IDENTIFIER设置。 – 2012-02-07 19:01:26

回答

6

如果不能重新做刀片,因为@Lamak建议,然后你可以执行UPDATE这样:

UPDATE t1 
    SET t1.Date = s.Date 
    FROM Table1 AS t1 
    INNER JOIN 
    (
    SELECT Item, [Date] = MAX([Date]) -- or MIN() 
     FROM Table2 
     GROUP BY Item 
) AS s 
    ON t1.Item = s.Item; 
+0

它看起来像你可能有意外接通t1和t2? – eek142 2012-02-07 19:07:30

+0

是的,对不起,通常Table1存在于Table2之前。我认为它应该很容易互换。 2012-02-07 19:10:09

+0

这成功地填写了我所要求的内容,但现在我认为我的原始请求没有完全思考。 我每天都会追加新的数据表2,与具有新的日期新的数据。我想我需要弄清楚我打算如何填写表1中需要的日期。 – eek142 2012-02-07 19:12:35

4

对于SQL Server您coul've使用一个INSERT声明:

INSERT INTO Table1(Item, Totals, [Date]) 
SELECT Item, SUM(Quantity), MIN([Date]) -- It could be MAX([Date]) 
FROM Table2 
GROUP BY Item 
+0

看来我过于复杂的东西,哈。这似乎做什么,我需要的列B. – eek142 2012-02-07 19:06:10

0

最简单的方法是使用一个简单的CTAS(CREATE TABLE AS选择):

select item as item, SUM(quantity) as Q, MIN(date) as d into table2 
from table1 
group by item 
+0

你得到的表倒退了(和我一样),并且用户还表示第二个表已经被创建和填充。使用'SELECT INTO',你会丢失目标表上可能已经创建的东西(索引,约束,触发器,权限,某些依赖关系等等)。 – 2012-02-07 19:12:31

0

而是创建一个表,你可以创建一个视图,使用select语句像@Lamak's answer。这样,你就不必更新新行每次设置Table2更新。

+0

表2将每天只有一次更新,每条记录都有其旁边对应的日期。在将新的一天的记录附加到Table2后,Table1将会更新。这里真的有必要吗?Table2更新后,我会将新数据附加到Table1。旧数据永远不会再被触摸。 – eek142 2012-02-07 19:36:50

+0

@eek142:在这种情况下,您的原始方法(计算一次总计并将它们存储在表中)似乎更合适。 – 2012-02-07 20:45:45

相关问题