2017-08-03 2 views
0

Ich habe eine Tabelle mit mehr als 1000 Datensätze. Hier ist ein Beispiel Auszug aus der Tabelle:Wie Zeilen in SQL Server-Tabelle in mehrere Tabellen aufgeteilt werden

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 

Im Prinzip habe ich 106 Funktionen gegen verschiedene versionTested leiten. Also, was ich tun möchte, ist die durchschnittliche Zeit für jede Funktion vs versionTested zu vergleichen.

Bitte finden Sie in der Ausgabe Suche nach unten:

Function1 Tabelle:

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 

Funktion Tabelle 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 

ich diese Art von Szenario möge alle 106 Funktionen. Wie kann dies in T-SQL erreicht werden?

Das letzte Ding wird Graphen jeder Funktion gegen verschiedene VersionTested zeichnen, um die durchschnittlichen Zeiten zu vergleichen.

Wie kann dies in T-SQL erreicht werden? Wahrscheinlich müssen diese Informationen nicht in mehrere Tabellen aufgeteilt werden? Jeder Vorschlag ist willkommen. Hier

ist der Code Ich bin fleißig an, aber ich nicht scheinen überall mit ihm zu gehen:

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

Sie suchen Datensätze zurück, so dass die Daten in einem Diagramm dargestellt werden können, nicht wahr? Wenn das so ist, glaube ich nicht, dass Sie den Drehpunkt brauchen. Werden Sie eine separate Grafik für jede Funktion oder alle Funktionen in einer Grafik haben? – Aidan

+0

@Aidan, ja werde ich separate Grafik für jede Funktion haben. Wie kann dies erreicht werden? – Immortal

Antwort

0

1This sollte das tun, was you'r fragen ...

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, Jason

0

Ich war nicht ganz sicher, was Sie als resultset sehen wollte. Es ist immer gut, wenn Sie eine Frage wie diese stellen, um nicht nur Beispieldaten, sondern auch Beispielausgaben anzuzeigen. Ich habe die Beispieldaten verdoppelt, so dass AVG eine Aufgabe zu erledigen hatte (wir wissen also, dass es funktioniert!).

Weil ich nicht wirklich sicher war, wie genau sollte der Dreh sein, gebe ich zwei Versionen:

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

Verwenden Sie die gleiche Tabellendeklaration und fügt wie oben, aber statt PIVOT WÄHLT die Verwendung folgende:

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 

Dies wird die SELECT-up in n getrennte SELECTS aufgeteilt. Wenn Sie ein DataSet (z. B. aus C#) verwenden, erhalten Sie im DataSet n verschiedene DataTables.

Ich denke zwar, dass Sie einige Gruppierung nach Datum hinzufügen möchten, um einen Durchschnitt pro Tag zu erhalten, aber ich überlasse es Ihnen, um herauszufinden.

+0

Ich möchte jede Funktion eine eigene Tabelle haben und beachten Sie, dass die VersionTested dynamisch sein muss – Immortal

+0

Bitte ändern Sie Ihre Frage, um Beispiel Endergebnis anzuzeigen (für eine Funktion Name ist genug).Dynamic VersionTested ist nur mit dynamischem SQL möglich –

+0

Ich habe die Frage geändert – Immortal

Verwandte Themen