2012-02-07 62 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

相關問題