当前位置: 代码迷 >> Sql Server >> 怎么实现下面的查询
  详细解决方案

怎么实现下面的查询

热度:28   发布时间:2016-04-24 09:40:31.0
如何实现下面的查询。

select * from fram.100001_tab

select * from fram.100002_tab

select * from fram.100002_tab



表fram.100001_tab的列:
数据
wfid wtid         rectime                  [WTUR.WSpd.Ra.F32] [WTUR.PwrReact.Ra.F32AVG]
100001 100001001 2014-07-20 14:10:00.000  7.37                  5.54
100001 100001001 2014-07-20 14:20:00.000  7.28      5.66
100001 100001001 2014-07-20 14:30:00.000  7.35
100001 100001001 2014-07-20 14:40:00.000  7.71
100001 100001001 2014-07-20 14:50:00.000  7.95
100001 100001001 2014-07-20 15:00:00.000  7.83


表fram.100002_tab的列:

数据
wfid wtid          rectime        [WTUR.WSpd.Ra.F32]   [WTUR.PwrReact.Ra.F32]
100002 100002001 2014-10-07 11:20:00.000     8.32     7.32
100002 100002001 2014-10-07 11:30:00.000     7.57     6.10
100002 100002001 2014-10-07 11:40:00.000     7.56     6.72
100002 100002001 2014-10-07 11:50:00.000     7.56     6.10
100002 100002001 2014-10-07 12:00:00.000     6.45     5.10

表fram.100003_tab的列:

数据
wfid wtid          rectime         [WTUR.PwrAt.Ra.F32]  [WTUR.PwrReact.Ra.F32]   [WTUR.PwrReact.Ra.F32MAX] 
100003 100003001 2014-11-12 11:00:00.000   9.36  7.10 11.71
100003 100003001 2014-11-12 13:30:00.000   9.44 7.10 10.92
100003 100003001 2014-11-12 13:40:00.000   9.42 6.99 11.22
100003 100003001 2014-11-12 13:50:00.000   9.22 7.10 10.78
100003 100003001 2014-11-12 14:00:00.000   9.05 7.32 10.47



想查询出的数据如下显示:可否实现? (也可能传入有fram.100004_tab, fram.100005_tab里面不知道有多少列。)

wfid wtid         rectime                  [WTUR.WSpd.Ra.F32]  [WTUR.PwrReact.Ra.F32]   [WTUR.PwrReact.Ra.F32MAX]    [WTUR.PwrReact.Ra.F32AVG]
100001 100001001 2014-07-20 14:10:00.000    7.37 5.54
100001 100001001 2014-07-20 14:20:00.000    7.28 5.66
100001 100001001 2014-07-20 14:30:00.000    7.35
100001 100001001 2014-07-20 14:40:00.000    7.71
100001 100001001 2014-07-20 14:50:00.000    7.95
100001 100001001 2014-07-20 15:00:00.000    7.83
100002 100002001 2014-10-07 11:20:00.000     8.32        7.32
100002 100002001 2014-10-07 11:30:00.000     7.57        6.10
100002 100002001 2014-10-07 11:40:00.000     7.56        6.72
100002 100002001 2014-10-07 11:50:00.000     7.56        6.10
100002 100002001 2014-10-07 12:00:00.000     6.45        5.10
100003 100003001 2014-11-12 11:00:00.000     9.36        7.10 11.71
100003 100003001 2014-11-12 13:30:00.000     9.44 7.10 10.92
100003 100003001 2014-11-12 13:40:00.000    9.42 6.99 11.22
100003 100003001 2014-11-12 13:50:00.000    9.22 7.10 10.78
100003 100003001 2014-11-12 14:00:00.000    9.05 7.32 10.47



------解决思路----------------------
合并这几个表结果?
看你的情况只能动态执行了
------解决思路----------------------
列数都不固定吗?那些列有MAX 和AVG的也是查出来的,还是还需要算一下
------解决思路----------------------
DECLARE @SQL NVARCHAR(MAX)
DECLARE @MAX INT
DECLARE @TABLE TABLE(NA NVARCHAR(128),CO INT)
INSERT INTO @TABLE
SELECT T1.NAME,COUNT(T2.id)CO FROM SYS.SYSOBJECTS T1
JOIN SYS.SYSCOLUMNS T2 ON T1.id=T2.id
WHERE T1.[name]IN('fram.100001_tab','fram.100002_tab','fram.100003_tab')
GROUP BY T1.[name]
;SELECT @SQL='SELECT * FROM ['+NA+'] WHERE 1=0 ',@MAX=CO FROM(
SELECT TOP 1 NA,CO FROM @TABLE
ORDER BY CO DESC
)T
SELECT @SQL=@SQL+'UNION ALL SELECT *'+REPLICATE(',NULL',@MAX-CO)+' FROM ['+NA+']' FROM @TABLE
--PRINT @SQL
EXEC(@SQL)
你参考下,应该可以~~
------解决思路----------------------
--用到的表
;WITH tables(table_name) AS (
    SELECT 'fram.100001_tab' UNION ALL
    SELECT 'fram.100002_tab' UNION ALL
    SELECT 'fram.100003_tab' UNION ALL
    SELECT 'fram.100001_tab'
)
SELECT *
  INTO #tables
  FROM tables

--表各自的字段
SELECT t.table_name,
       c.name column_name,
       c.column_id
  INTO #columns
  FROM #tables t
  JOIN sys.columns c
    ON c.object_id = OBJECT_ID(t.table_name)

--所有字段全集
    SELECT column_name,
           ROW_NUMBER() OVER(ORDER BY MIN(column_id), MIN(table_name)) column_id
      INTO #outColumns
      FROM #columns
  GROUP BY column_name

--各表用NULL补齐字段
    SELECT t.table_name,
           ISNULL(c.column_name,'NULL AS '+oc.column_name) AS column_name,
           oc.column_id
      INTO #inColumns
      FROM #tables t
      JOIN #outColumns oc
        ON 1=1
 LEFT JOIN #columns c
        ON t.table_name = c.table_name
       AND oc.column_name = c.column_name
/*
SELECT * FROM #tables
SELECT * FROM #columns
SELECT * FROM #outColumns
SELECT * FROM #inColumns
*/

DECLARE @sql nvarchar(max)

;WITH tableSQL AS (
    SELECT 'SELECT ' + 
           Stuff((SELECT ','+column_name
                    FROM #inColumns ic
                   WHERE ic.table_name = t.table_name
                     for xml path('')
                 ),
                 1,1,'') +
           ' FROM ' + t.table_name AS sql
      FROM #tables t
)
SELECT @sql = Stuff((SELECT ' UNION ALL '+sql
                       FROM tableSQL ic
                        for xml path('')
                    ),
                    1,11,'')
PRINT @sql
  相关解决方案