2011-06-01 121 views
0

我在sql查询中遇到了问题。我有我的数据库在每个表中具有相同的表和相同的列。我想从每个数据库中的两个或三个表中检索相同的列。 ex。从sql server中动态获取数据

 
DatebaseName  TableName(exist in every database) 

         
 
Demo Patient, charge, WorkDescriptor Medical Patient, charge, WorkDescriptor Test Patient, charge, WorkDescriptor

这是我的查询

 

select 
db_name() as DBName, 
substring(convert(varchar, c.eDate, 101), 0, 11) as Date, 
c.operatorID as username, 
count(wd.code) as TotalCPT, 
p.acctnumber as TotalPatient, 
sum(c.amount) as TotalAmount 
from Charge c 
inner join workDescriptor wd on wd.IDWorkDescriptor = c.WorkDescriptorID 
inner join patient p on c.PatientID = p.IDPatient 
where c.eDate between '01/01/2009' and '05/31/2011' 
group by c.operatorID, substring(convert(varchar, c.eDate, 101), 0, 11), p.acctnumber 
order by substring(convert(varchar, c.eDate, 101), 0, 11) 
compute sum(count(wd.code)) 

这是retreive当前数据库的数据。但是 我想从每个数据库输出数据。 像 例如溶液

 
DBName  Date(mm/dd/yyyy)Username TotalCPT TotalPatient TotalAmount 
Demo   01/01/2010  A   1   1   41.82 
Demo   01/01/2010  A   5   4   70.00 
Demo   01/01/2010  B   3   3   41.84 
Medical  01/02/2010  A   1   1    0.00 
Medical  01/02/2010  B   5   4   50.24 
Medical  01/02/2010  B   3   3   21.50  
Test   01/03/2010  A   1   1   56.98   
Test   01/03/2010  A   5   4   45.75   
Test   01/03/2010  B   3   3   56.52  
             ------  --------  --------------- 
             27   25   384.65 

任何建议将受到赞赏。如果您有任何疑问可以实现我的目标。 在此先感谢

回答

0

很简单,使用联合,3部分命名和硬编码数据库名称;像这样:

select 
'Demo' as DBName, 
substring(convert(varchar, c.eDate, 101), 0, 11) as Date, 
c.operatorID as username, 
count(wd.code) as TotalCPT, 
p.acctnumber as TotalPatient, 
sum(c.amount) as TotalAmount 
from Demo.dbo.Charge c 
inner join Demo.dbo.workDescriptor wd on wd.IDWorkDescriptor = c.WorkDescriptorID 
inner join Demo.dbo.patient p on c.PatientID = p.IDPatient 
where c.eDate between '01/01/2009' and '05/31/2011' 
group by c.operatorID, substring(convert(varchar, c.eDate, 101), 0, 11), p.acctnumber 
order by substring(convert(varchar, c.eDate, 101), 0, 11) 
compute sum(count(wd.code)) 
UNION ALL 
select 
'Medical' as DBName, 
substring(convert(varchar, c.eDate, 101), 0, 11) as Date, 
c.operatorID as username, 
count(wd.code) as TotalCPT, 
p.acctnumber as TotalPatient, 
sum(c.amount) as TotalAmount 
from Medical.dbo.Charge c 
inner join Medical.dbo.workDescriptor wd on wd.IDWorkDescriptor = c.WorkDescriptorID 
inner join Medical.dbo.patient p on c.PatientID = p.IDPatient 
where c.eDate between '01/01/2009' and '05/31/2011' 
group by c.operatorID, substring(convert(varchar, c.eDate, 101), 0, 11), p.acctnumber 
order by substring(convert(varchar, c.eDate, 101), 0, 11) 
compute sum(count(wd.code)) 
UNION ALL 
select 
'Test' as DBName, 
substring(convert(varchar, c.eDate, 101), 0, 11) as Date, 
c.operatorID as username, 
count(wd.code) as TotalCPT, 
p.acctnumber as TotalPatient, 
sum(c.amount) as TotalAmount 
from Test.dbo.Charge c 
inner join Test.dbo.workDescriptor wd on wd.IDWorkDescriptor = c.WorkDescriptorID 
inner join Test.dbo.patient p on c.PatientID = p.IDPatient 
where c.eDate between '01/01/2009' and '05/31/2011' 
group by c.operatorID, substring(convert(varchar, c.eDate, 101), 0, 11), p.acctnumber 
order by substring(convert(varchar, c.eDate, 101), 0, 11) 
compute sum(count(wd.code)) 

还有其他的方法来做到这一点,但是这一次会工作,只是因为别人认为我可以现在想的那样有效。

更新基于COMMENT

确定,这应该工作,可能需要一些调整,但这个想法是有:

CREATE TABLE #t1 (DBName VARCHAR(128), [Date] DATETIME, username VARCHAR(128), TotalCPT INT, TotalPatient INT, TotalAmount DECIMAL (16,2)) 


DECLARE @dbName VARCHAR(128), @sql VARCHAR(MAX), @fromDate DATETIME, @toDate DATETIME 

SELECT @fromDate = '01/01/2009', @toDate = '05/31/2011' 

DECLARE db_cursor CURSOR FOR 

SELECT name 
FROM Master.sys.databases 
WHERE name NOT IN ('master','tempdb','msdb','model') 

OPEN db_cursor 

FETCH NEXT FROM db_cursor INTO @dbName 

WHILE @@FETCH_STATUS = 0 
BEGIN 

SELECT @sql = ' 
INSERT INTO #t1(DBName, [Date], username, TotalCPT, TotalPatient, TotalAmount) 
select ''' + @dbName + ''' as DBName, 
substring(convert(varchar, c.eDate, 101), 0, 11) as Date, 
c.operatorID as username, 
count(wd.code) as TotalCPT, 
p.acctnumber as TotalPatient, 
sum(c.amount) as TotalAmount 
from Demo.dbo.Charge c 
inner join Demo.dbo.workDescriptor wd on wd.IDWorkDescriptor = c.WorkDescriptorID 
inner join Demo.dbo.patient p on c.PatientID = p.IDPatient 
where c.eDate between ''' + @fromDate + ''' and ''' + @toDate + ''' 
group by c.operatorID, substring(convert(varchar, c.eDate, 101), 0, 11), p.acctnumber 
order by substring(convert(varchar, c.eDate, 101), 0, 11) 
compute sum(count(wd.code))' 

EXEC (@sql) 

FETCH NEXT FROM db_cursor INTO @dbName 

END 
CLOSE db_cursor 
DEALLOCATE db_cursor 


SELECT * FROM #t1 

DROP TABLE #t1 
+0

感谢您的配合。我明白你在查询中做了什么,但如果我有50或60个数据库,那我该怎么做。还有一件事是我没有任何表中的数据库名称,我想从master..sysdatabases中检索数据库名称并根据它们检索数据。谢谢 – 2011-06-02 07:48:02

+0

好的,我为你更新了答案 – Ryk 2011-06-02 11:27:25

0

如果绝对相同的查询应该运行针对每一个数据库,你可以尝试这样的事情:

DECLARE @DBIndex int; 

DECLARE @results TABLE ( -- the types are based on assumptions, should be reviewed 
    DBName sysname, 
    Date varchar(11), 
    username varchar(50), 
    TotalCPT int, 
    TotalPatient int, 
    TotalAmount decimal(10, 2) 
); 

SET @DBIndex = 0; 

WHILE @DBIndex < 3 BEGIN 
    SET @DBIndex = @DBIndex + 1; 
    IF @DBIndex = 1 
    USE Demo 
    ELSE IF @DBIndex = 2 
    USE Medical 
    ELSE IF @DBIndex = 3 
    USE Test; 

    INSERT INTO @results 
    select 
    db_name() as DBName, 
    substring(convert(varchar, c.eDate, 101), 0, 11) as Date, 
    c.operatorID as username, 
    count(wd.code) as TotalCPT, 
    p.acctnumber as TotalPatient, 
    sum(c.amount) as TotalAmount 
    from Charge c 
    inner join workDescriptor wd on wd.IDWorkDescriptor = c.WorkDescriptorID 
    inner join patient p on c.PatientID = p.IDPatient 
    where c.eDate between '01/01/2009' and '05/31/2011' 
    group by c.operatorID, substring(convert(varchar, c.eDate, 101), 0, 11), p.acctnumber 
    order by substring(convert(varchar, c.eDate, 101), 0, 11) 
    compute sum(count(wd.code)) 
END; 

SELECT * 
FROM @results 
ORDER BY … 

我可能会删除ORDER BY子句从主队列ry,因为最终重要的是最终SELECT中的ORDER BY,即从@results。然后可能需要将一些其他列添加到@results,以便它们在ORDER BY中使用。