2017-04-17 69 views
1

我有一個選擇查詢,我正在使用Access來獲取一些特定的數據,我想實現。現在我正在轉向SQL Server(創建ssrs報告),所以我想從Access獲取此查詢並在SQL Server中使用它,並在每次執行此查詢時創建一個新表。從選擇語句創建新表

這裏是我在Access數據庫使用我的當前查詢:

select taxid, address1, count(address1) 
from dbo.tblaccounts 
group by taxid, address1 
order by address1 asc, count(address1) desc; 

我應該在哪裏插入/ into語句...或者是別的東西,我需要在這裏。

+2

在'select'和'from'子句之間添加'INTO TableNameHere',這就是你要求的嗎? – Igor

+0

我已經在下面提供了一個答案,但是如果我的目標偏離了目標,請謹慎地在報表運行時創建表格:這些應該是「臨時表格」,否則如果兩個人在兩個操作中運行報表將會干擾一個另一個。在SQL-Server中,您以與其他任何方式相同的方式創建臨時表,但名稱以'#'開頭。 –

回答

1

如果您需要基於該查詢來創建新表,有很多種方法,最簡單的方法是使用Select Into From,該查詢將是:

select taxid, address1, count(address1) 
INTO TABLEA 
from dbo.tblaccounts 
group by taxid, address1 
order by address1 asc, count(address1) desc; 

注意:此方法只傳輸數據和約束條件等。將不會被保留下來。 但是如果每次運行查詢時都需要獲取該表,則需要DROP並重新創建該表,否則會出現該對象錯誤。另外,可能有很多方法。簡單的方法是:

IF EXISTS(select 1 from sys.objects where name = 'TABLEA' and type = 'U') --or you could use IF EXISTS(OBJECTID('TABLEA','U')) 
BEGIN 
DROP TABLE TABLEA 
END 
--then paste your query after 
    select taxid, address1, count(address1) 
    INTO TABLEA 
    from dbo.tblaccounts 
    group by taxid, address1 
    order by address1 asc, count(address1) desc; 
2

你正在執行的操作叫做Select Into或Create Table As Select(CTAS)。 MSDN有關何時使用CTAS與Select Into的討論(https://docs.microsoft.com/en-us/azure/sql-data-warehouse/sql-data-warehouse-develop-ctas)。雖然本文討論數據倉庫,但在這種情況下,IMO的討論是有效的。

由於我從另一個表中創建的大多數表都涉及複雜的聯接和聯合,我傾向於使用CTAS。也就是說,Select Into方法可能適用於您的方案。

您將使用代碼是:

CREATE TABLE AccountSummaryOrWhatever AS 
select taxid, address1, count(address1) 
from dbo.tblaccounts 
group by taxid, address1; 

或者

select taxid, address1, count(address1) 
INTO AccountSummaryOrWhatever 
from dbo.tblaccounts 
group by taxid, address1; 
+0

CTAS可以在SQL Server的數據倉庫版本之外使用嗎?否則,一個重要的限制是CTAS對許多SQL Server用戶不可用。 –

+0

我已經使用了Oracle 10g和11i的CTAS方法,5.5版本以來的MySql以及至少Server 2000以來的MS SQL。這是一種標準做法,並不限於數據倉庫版本的軟件。 –

+0

你沒有在SQL Server 2000中使用CTAS,除非你的意思是'SELECT INTO'不同。至少2008 R2(基於經驗)並未提供CTAS,除了「Azure SQL數據倉庫」和「並行數據倉庫」外,每個文檔在MS SQL Server到2016年都不可用。https://docs.microsoft.com/ EN-US/SQL/T-SQL /語句/創建表,作爲選-Azure的SQL數據倉庫。請注意,目錄中只有一個適用於倉庫版本的「表格選擇」條目。 –

1

我有一種預感,你真正想要做的是創建一個視圖。 MS Access中的查詢就像視圖(或者在ADD/DELETE/UPDATE查詢的情況下,它們就像存儲過程一樣)。就像MS Access查詢一樣,一個視圖可以像其他代碼一樣被引用,就像一個Access Query一樣,它就像一個「始終最新」的表。

create view ViewName 
as 
select 
    taxid, 
    address1, 
    count(address1) as address_count 
from 
    dbo.tblaccounts 
group by 
    taxid, 
    address1 

你會注意到我已經放棄了ORDER BY條款。他們在這裏是不允許的,你可以從這個視圖中選擇任何代碼來指定順序。

+0

謝謝大家。如果我想添加一個其他列,比如...:有一個列名'cust_name',我想選擇DISTINCT'cust_name'(客戶名稱),而不是將該行添加到代碼中的位置?所以,我的結果應該給我列taxid和不同的客戶名稱。 (地址一不重要,也可以使計數不再存在,因爲我的目標是通過taxid和customername實現唯一記錄)。非常感謝 – user2225470

+0

這聽起來像是一個額外的問題,並可能最好提交作爲一個新的問題。如果有幫助,你可以在這個問題中引用這個問題。同時,如果這裏的答案之一是你所需要的,那就把它標記爲已接受。 –

0
Create Procedure proc_new_table 
As 
SET NOCOUNT ON; 

IF OBJECT_ID('new_table','U') IS NOT NULL 
DROP TABLE new_table; 
select distinct cust_name, taxid 
INTO new_table 
from tblaccounts; 

謝謝大家!