2017-08-03 46 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

相關問題