2017-08-03 261 views
0

我有一个包含1000多条记录的表。这里是从表中样品提取物:如何将SQL Server表中的行拆分为多个表

VersionTested  RunDate   TestName  AverageTime 
--------------------------------------------------------------- 
v.1    20170802-1036  function1  10.02 
v.1    20170802-1036  function2  12.36 
v.1    20170802-1036  function3  11.36 
v.1    20170802-1036  function4  14.36 
v.2    20170803-1000  function1  10.06 
v.2    20170803-1000  function2  12.36 
v.2    20170803-1000  function3  12.00 
v.2    20170803-1000  function4  11.02 
v.3    20170731-1000  function1  10.02 
v.3    20170731-1000  function2  12.36 
v.3    20170731-1000  function3  11.02 
v.3    20170731-1000  function4  12.56 

基本上我有106层的功能正在针对不同的运行versionTested。所以我想要做的是比较每个函数与versionTested的平均时间。

请参阅输出要寻找以下:

Function1表:

VersionTested RunDate  TestName AverageTime 
--------------------------------------------------------- 
v.1    20170802-1036 function1 10.02 
v.2    20170803-1000 function1 10.06 
v.3    20170731-1000 function1 10.02 

功能2表:

VersionTested RunDate  TestName AverageTime 
------------------------------------------------------- 
    v.1   20170802-1036 function2 12.36 
    v.2   20170803-1000 function2 12.36 
    v.3   20170731-1000 function2 12.36 

我想这种情况下的所有106种功能。这在T-SQL中如何实现?

最后一件事情是将每个函数的图形与不同的VersionTested进行比较,以比较平均时间。

这在T-SQL中如何实现?可能没有必要将这些信息分成多个表格?任何建议都是值得欢迎的。

这里是我忙工作的代码,但我似乎没有用它去任何地方:

SELECT 'RunDate' AS DateTested, 
     v.1, v.2, v.3 
     FROM 
     (SELECT * 
     FROM TableName) AS SourceTable 
     PIVOT 
     (
     SUM(VersionTested) 
     FOR VersionTested IN (v.1, v.2, v.3) 
     ) AS PivotTable; 
+0

您正在寻找返回的数据集,从而使数据可以在图表中显示,是吗?如果是这样,我不认为你需要这个支点。你会为每个函数有一个单独的图表,还是一个图表上的所有函数? – Aidan

+0

@Aidan,是的,我将为每个功能分别绘制图表。这怎么能实现? – Immortal

回答

0

1本应该做的事情找你问...

USE tempdb; 
GO 

IF OBJECT_ID('tempdb.dbo.FunctionTestAll', 'U') IS NOT NULL 
DROP TABLE dbo.FunctionTestAll; 

CREATE TABLE dbo.FunctionTestAll (
    VersionTested CHAR(3) NOT NULL, 
    RunDate CHAR(13) NOT NULL, 
    TestName CHAR(9) NOT NULL, 
    AverageTime DECIMAL(5,2) 
    ); 
INSERT dbo.FunctionTestAll (VersionTested, RunDate, TestName, AverageTime) VALUES 
    ('v.1', '20170802-1036', 'function1', 10.02), 
    ('v.1', '20170802-1036', 'function2', 12.36), 
    ('v.1', '20170802-1036', 'function3', 11.36), 
    ('v.1', '20170802-1036', 'function4', 14.36), 
    ('v.2', '20170803-1000', 'function1', 10.06), 
    ('v.2', '20170803-1000', 'function2', 12.36), 
    ('v.2', '20170803-1000', 'function3', 12.00), 
    ('v.2', '20170803-1000', 'function4', 11.02), 
    ('v.3', '20170731-1000', 'function1', 10.02), 
    ('v.3', '20170731-1000', 'function2', 12.36), 
    ('v.3', '20170731-1000', 'function3', 11.02), 
    ('v.3', '20170731-1000', 'function4', 12.56); 
GO 

--SELECT * FROM dbo.FunctionTestAll fta 

--========================================================= 

IF OBJECT_ID('tempdb.dbo.TablesToCreate', 'U') IS NOT NULL 
DROP TABLE dbo.TablesToCreate; 

SELECT 
    TestID = ROW_NUMBER() OVER (ORDER BY (SELECT NULL)), 
    fta.TestName 
    INTO dbo.TablesToCreate 
FROM 
    dbo.FunctionTestAll fta 
GROUP BY 
    fta.TestName; 

---------------------------------------------------------- 

DECLARE @TestID INT = 0; 

WHILE EXISTS (SELECT 1 FROM dbo.TablesToCreate ttc WHERE ttc.TestID > @TestID) 
BEGIN 
    SET @TestID = @TestID + 1; 

    DECLARE @CreateTableSQL VARCHAR(1000) = ''; 

    SELECT 
     @CreateTableSQL = CONCAT(' 
CREATE TABLE dbo.', ttc.TestName, ' (
    VersionTested CHAR(3) NOT NULL, 
    RunDate CHAR(13) NOT NULL, 
    TestName CHAR(9) NOT NULL, 
    AverageTime DECIMAL(5,2) 
    ); 

INSERT dbo.', ttc.TestName, ' (VersionTested, RunDate, TestName, AverageTime) 
SELECT 
    fta.VersionTested, fta.RunDate, fta.TestName, fta.AverageTime 
FROM 
    dbo.FunctionTestAll fta 
WHERE 
    fta.TestName = ''', ttc.TestName, ''';' 
     ) 
    FROM 
     dbo.TablesToCreate ttc 
    WHERE 
     ttc.TestID = @TestID; 

    EXEC(@CreateTableSQL); 
END; 
GO 


-- SELECT * FROM dbo.function1; 
-- SELECT * FROM dbo.function2; 
-- SELECT * FROM dbo.function3; 
-- SELECT * FROM dbo.function4; 

-- DROP TABLE dbo.function1; 
-- DROP TABLE dbo.function2; 
-- DROP TABLE dbo.function3; 
-- DROP TABLE dbo.function4; 

HTH,杰森

0

我不能完全确定你想看到的一个结果是什么。当问这样的问题时,不仅要显示样本数据,还要显示样本输出,这总是很好的。我将样本数据翻了一番,以便AVG有工作要做(所以我们知道它正在工作!)。

因为我真的不知道枢轴应该如何准确是,我举两个版本:

declare @versiontests table 
(
versiontested char(3), 
datetested datetime, 
functionname varchar(15), 
timetaken float 
) 
INSERT INTO @versiontests VALUES('v.1','2017-08-02 10:36','function1',10.02) 
INSERT INTO @versiontests VALUES('v.1','2017-08-02 10:36','function2',12.36) 
INSERT INTO @versiontests VALUES('v.1','2017-08-02 10:36','function3',11.36) 
INSERT INTO @versiontests VALUES('v.1','2017-08-02 10:36','function4',14.36) 
INSERT INTO @versiontests VALUES('v.2','2017-08-03 10:00','function1',10.06) 
INSERT INTO @versiontests VALUES('v.2','2017-08-03 10:00','function2',12.36) 
INSERT INTO @versiontests VALUES('v.2','2017-08-03 10:00','function3',12.00) 
INSERT INTO @versiontests VALUES('v.2','2017-08-03 10:00','function4',11.02) 
INSERT INTO @versiontests VALUES('v.3','2017-07-31 10:00','function1',10.02) 
INSERT INTO @versiontests VALUES('v.3','2017-07-31 10:00','function2',12.36) 
INSERT INTO @versiontests VALUES('v.3','2017-07-31 10:00','function3',11.02) 
INSERT INTO @versiontests VALUES('v.3','2017-07-31 10:00','function4',12.56) 
INSERT INTO @versiontests VALUES('v.1','2017-08-02 11:36','function1',10.22) 
INSERT INTO @versiontests VALUES('v.1','2017-08-02 11:36','function2',12.31) 
INSERT INTO @versiontests VALUES('v.1','2017-08-02 11:36','function3',11.26) 
INSERT INTO @versiontests VALUES('v.1','2017-08-02 11:36','function4',14.16) 
INSERT INTO @versiontests VALUES('v.2','2017-08-03 11:00','function1',10.56) 
INSERT INTO @versiontests VALUES('v.2','2017-08-03 11:00','function2',12.56) 
INSERT INTO @versiontests VALUES('v.2','2017-08-03 11:00','function3',12.40) 
INSERT INTO @versiontests VALUES('v.2','2017-08-03 11:00','function4',11.22) 
INSERT INTO @versiontests VALUES('v.3','2017-07-31 11:00','function1',10.52) 
INSERT INTO @versiontests VALUES('v.3','2017-07-31 11:00','function2',12.46) 
INSERT INTO @versiontests VALUES('v.3','2017-07-31 11:00','function3',11.09) 
INSERT INTO @versiontests VALUES('v.3','2017-07-31 11:00','function4',12.37) 

SELECT functionname, datetested, [v.1], [v.2], [v.3] 
     FROM 
     (SELECT CAST(datetested AS date) as datetested, versiontested, functionname, timetaken 
     FROM @versiontests) AS SourceTable 
     PIVOT 
     (
     AVG(timetaken) FOR versiontested in ([v.1], [v.2], [v.3]) 
     ) AS PivotTable 
     ; 
SELECT functionname, [v.1], [v.2], [v.3] 
     FROM 
     (SELECT versiontested, functionname, timetaken 
     FROM @versiontests) AS SourceTable 
     PIVOT 
     (
     AVG(timetaken) FOR versiontested in ([v.1], [v.2], [v.3]) 
     ) AS PivotTable 
     ; 

编辑

使用相同的表声明,如上面插入但不是PIVOT选信号使用如下:

declare @functionNames table 
(
functionname varchar(15), 
rownum int 
) 

INSERT INTO @functionNames 
SELECT d.functionname, ROW_NUMBER() OVER (ORDER BY d.functionname) from 
(SELECT DISTINCT functionname FROM @versiontests) as d 

declare @cnt int = (SELECT COUNT(*) FROM @functionNames) 
declare @rowPtr int = 0 
declare @tempFunc varchar(15) 


while @rowPtr < @cnt 
    begin 
     SET @rowPtr = @rowPtr + 1 
     SET @tempFunc = (SELECT functionname FROM @functionNames WHERE rownum = @rowPtr)   
     SELECT versiontested, datetested, functionname, timetaken FROM @versiontests 
      WHERE functionname = @tempFunc 
    end 

这会将SELECT分成n个独立的SELECTS。如果您使用DataSet(例如,来自c#),您将在DataSet中获得n个不同的DataTables。

我认为虽然你会希望按日期添加一些分组来获得平均每天,但我把它留给你弄清楚。

+0

我希望每个函数都有自己的表,并且注意VersionTested必须是动态的 – Immortal

+0

请修改您的问题以显示示例最终结果集(对于一个函数名称就足够了)。动态版本测试是唯一可能的动态SQL –

+0

我已经修正了问题 – Immortal