如何将SQL Server表中的行拆分为多个表
问题描述:
我有一个包含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;
答
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,杰森
答
我不能完全确定你想看到的一个结果是什么。当问这样的问题时,不仅要显示样本数据,还要显示样本输出,这总是很好的。我将样本数据翻了一番,以便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。
我认为虽然你会希望按日期添加一些分组来获得平均每天,但我把它留给你弄清楚。
您正在寻找返回的数据集,从而使数据可以在图表中显示,是吗?如果是这样,我不认为你需要这个支点。你会为每个函数有一个单独的图表,还是一个图表上的所有函数? – Aidan
@Aidan,是的,我将为每个功能分别绘制图表。这怎么能实现? – Immortal