Pivot SQL для создания пользовательских DataTable? - PullRequest
0 голосов
/ 23 сентября 2010

В настоящее время я работаю над проектом на C # и использую MySql в качестве базы данных.В настоящее время у меня проблема с созданием пользовательской таблицы данных, которую я хочу показать в своем отчете.Дополнительная информация: В тесте не может быть никаких комбинаций ячеек и клапанов для теста, но для одного теста он использует заданный диапазон значений и ячеек, предварительно определенных перед каждым тестом.

Таблица результатов (образец)

 TestID | CellID | ValveID | OutputValue1| OutputValue2 |
1       | 1      | 1       | 2.5         | 0.12         |
1       | 1      | 1       | 2.5         | 0.12         |
1       | 1      | 2       | 2.8         | 0.13         |
1       | 2      | 1       | 3.2         | 0.12         |
1       | 2      | 2       | 3.5         | 0.12         |
1       | 2      | 4       | 4.1         | 0.14         |

Таким образом, для примера Valve 3 не тестировался в этом конкретном примере.Но можете использовать, если хотите.По сути, строки моей таблицы генерируются динамически на основе этой таблицы результатов.

Ожидаемый отчет

Test ID = 1
                     Valves
       |     1     |     2     |     4     |
CellID |Out1 | Out2| Out1| Out2|Out1 | Out2|
1      | 2.5 | 0.12| 2.8 | 0.13| 2.9 | 0.12|  
2      | 3.2 | 0.12| 3.5 | 0.12| 4.1 | 0.14|

Out1 = OutputValue1 Out2 = OutputValue2 Может ли кто-нибудь помочь мне, направив меня на хорошую ссылкуобъяснение, как получить такую ​​динамическую таблицу данных

Ответы [ 2 ]

0 голосов
/ 23 сентября 2010

Попробуйте этот код SQL.Я воссоздал фиктивный стол, похожий на ваш оригинальный стол.Существует UDF, который также должен быть создан.Оставшийся код может быть частью сохраненного процесса.

set xact_abort on
begin tran
CREATE TABLE TestTable
(
TestId int not null,
CellId int not null,
valveid int not null,
op1 numeric(5,2) not null,
op2 numeric (5,2) not null
)
go

CREATE FUNCTION GetOutputString
(
@TestId INT,
@CellId INT
)
RETURNS VARCHAR(1000)
AS
BEGIN
    DECLARE @output VARCHAR(1000)
    SELECT @output = ISNULL(@output + ';','')
                     +
                     CAST(valveid AS VARCHAR(5)) + '#'
                     +
                     CAST(op1 as VARCHAR(10))+ ','
                     +
                     CAST(op2 as VARCHAR(10))
      FROM TestTable
     WHERE TestId = @testid
       AND cellid = @cellid

     RETURN @output
END
go
-- insert dummy data
INSERT INTO TestTable
SELECT 1, 1, 1, 2.5, .12
UNION
SELECT 1, 1, 2, 2.8, .13
UNION
SELECT 1, 2, 1, 3.2, .12
UNION
SELECT 1, 2, 2, 3.5, .12
UNION
SELECT 1, 2, 4, 4.5, .13

-- create temp table/table variable depending on the size of the actual table.
DECLARE @tmp TABLE (
TestId int not null,
CellId int not null,
OutputString VARCHAR(1000) null
)

INSERT INTO @tmp (TestId, CellId)
SELECT TestId, CellId
FROM TestTable
GROUP BY TestId,CellId

UPDATE @tmp
   SET OutputString = dbo.GetOutputString(TestId, CellId)

SELECT * FROM @tmp
rollback

Он возвращает возвращаемые через точку с запятой значения выходных значений для каждого клапана.Конечно, во внешнем интерфейсе вам нужно будет написать код, который идентифицирует valveid как число между точкой с запятой (;) и хешем (#).Вот вывод, который производит вышеупомянутый SQL:

1   1   1#2.50,0.12;2#2.80,0.13
1   2   1#3.20,0.12;2#3.50,0.12;4#4.50,0.13
0 голосов
/ 23 сентября 2010

Я вообще не проверял это, но я думаю, что это что-то вроде этого в Sql для предоставленных вами данных.

Select s.CellId,
   (select s1.OutputValue1 From Sample s1 Where s1.CellId=s.CellId and s1.ValveId=1 and s1.TestId=s.TestId) as Valve1_Out1,
   (select s1.OutputValue2 From Sample s1 Where s1.CellId=s.CellId and s1.ValveId=1 and s1.TestId=s.TestId) as Valve1_Out2,
   (select s1.OutputValue1 From Sample s1 Where s1.CellId=s.CellId and s1.ValveId=2 and s1.TestId=s.TestId) as Valve2_Out1,
   (select s1.OutputValue2 From Sample s1 Where s1.CellId=s.CellId and s1.ValveId=2 and s1.TestId=s.TestId) as Valve2_Out2,
   (select s1.OutputValue1 From Sample s1 Where s1.CellId=s.CellId and s1.ValveId=4 and s1.TestId=s.TestId) as Valve4_Out1,
   (select s1.OutputValue2 From Sample s1 Where s1.CellId=s.CellId and s1.ValveId=4 and s1.TestId=s.TestId) as Valve4_Out2
 From Sample s
 Where s.TestId=1
 Group By s.CellId, s.TestId
 Order By s.CellId

Может также манипулировать данными на сервере в C #как только он загружен в DataTable.Вот пример чего-то подобного здесь (быстрый Google), который показывает, как создавать DataTables в коде.Очевидно, что ваше требование - это больше, чем прямая точка, но это тот же принцип.

...