这是我在Excel中的实际数据,可以在C#Windows应用程序的DataGridView中成功读取。
Test | Energy |
---------------------
C018-3L-1 | 113 |
C018-3L-2 | 79 |
C018-3L-3 | 89 |
C021-3T-1 | 115 |
C021-3T-2 | 100 |
但是现在我想要在DataGridView中使用以下格式的数据:
Test |Energy-1|Energy-2|Energy-3 |
------------------------------------
C018-3L |113 |79 |89 |
C021-3T |115 |100 |NULL |
这是我的代码:
private void TensileEnergyData_Load(object sender, EventArgs e)
{
try
{
string sourcefilepath = ConfigurationManager.AppSettings["FilePath"].ToString();
string[] files = Directory.GetFiles(sourcefilepath, "*.xlsx");
foreach (string s in files)
{
string excelConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + s + ";Extended Properties='Excel 12.0;HDR=YES';";
// Create Connection to Excel Workbook
using (OleDbConnection connection = new OleDbConnection(excelConnectionString))
{
connection.Open();
da = new OleDbDataAdapter("Select Test, Energy FROM [Sheet1$]", connection);
da.Fill(dtExcelData);
connection.Close();
}
}
}
catch (Exception ex)
{
objDAL.SendExcepToDB(ex, "TensileEnergyData_Load");
MessageBox.Show("Fail to read data...!!");
}
dataGridView1.Visible = true;
dataGridView1.DataSource = dtExcelData;
}
如何使用分组依据来实现?
答案 0 :(得分:1)
这用[sql-server]
标记。这是一种SQL Server方法:
您可以尝试
我创建一个样机表
DECLARE @tbl TABLE(Test VARCHAR(100),Energy INT);
INSERT INTO @tbl VALUES
('C018-3L-1',113)
,('C018-3L-2',79)
,('C018-3L-3',89)
,('C021-3T-1',115)
,('C021-3T-2',100);
这是查询
SELECT p.*
FROM
(
SELECT LEFT(t.Test,7) AS Test
,CONCAT('Energy-',RIGHT(t.Test,1)) AS ColumnName
,Energy
FROM @tbl t
) tbl
PIVOT
(
MAX(Energy) FOR ColumnName IN([Energy-1],[Energy-2],[Energy-3])
) p;
结果
Test Energy-1 Energy-2 Energy-3
C018-3L 113 79 89
C021-3T 115 100 NULL
一些解释:
这取决于您的字符串的固定格式,最多3列。另一种方法是搜索最后一个连字符,并使用其位置在开头部分和数字之间分割字符串。使用不同数量的数字,您必须知道预期的最大值,或者您必须完全走一条通用路线(例如动态SQL)。
答案 1 :(得分:1)
另一种方法可以使用CASE
SELECT t.Test,
Max(energy1) [Energy-1],
Max(energy2) [Energy-2],
Max(energy3) [Energy-3]
FROM (SELECT LEFT(test, Len(test) - Charindex('-', Reverse(test))) Test,
case when test like '%-1' then Energy else null end 'Energy1',
case when test like '%-2' then Energy else null end 'Energy2',
case when test like '%-3' then Energy else null end 'Energy3'
FROM [TABLE_NAME]) t
GROUP BY t.test