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

[はい]を選択すると、データがグラフ上に表示できるように、データセットを返すために探していますか?もしそうなら、私はあなたがピボットを必要としないと思います。各関数ごとに別々のグラフを作成するか、すべての関数を1つのグラフで作成しますか? – Aidan

+0

@エイダン、はい、各機能ごとに別々のグラフを表示します。これはどのように達成できますか?私は、各機能は、独自のテーブルを持ちたいともVersionTestedが – Immortal

答えて

0

1このはyou'rが求めて何をすべき...

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には仕事がありました(私たちはそれが働いていることを知っています)。

私はピボットがどうあるべきかを正確に本当にわからなかったので、私は2つのバージョンが与える:上記と同じテーブルの宣言と挿入を使用しますが、代わりにPIVOTの使用SELECTS

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 
     ; 

EDIT

を以下:

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に分割します。データセットを使用している場合(たとえばC#から)、DataSetにはn個の異なるDataTableがあります。

は、私はあなたが一日あたりの平均を取得するには、日付によっていくつかのグループを追加しようとすることがけれども思うが、私はあなたに把握することを去ります。

+0

は、例えば、最終的な結果セットを(一つの関数の名前が十分である)を示すためにあなたの質問を修正してください。Dynamic VersionTestedは動的SQLでのみ可能 – Immortal

+0

ダイナミックでなければならないことに注意してください –

+0

質問を修正しました – Immortal

関連する問題