2017-04-17 66 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; 

谢谢大家!