Удалите строку после '-' и сгруппируйте оставшуюся строку и столбец сводки - PullRequest
0 голосов
/ 21 февраля 2019

Вот мои фактические данные в Excel, которые я успешно могу прочитать в DataGridView в C # приложении Windows.

Test       | Energy |
---------------------
C018-3L-1  | 113    |
C018-3L-2  | 79     |
C018-3L-3  | 89     |
C018-3L-4  | 90     |
C018-3L-5  | 95     |
C021-3T-1  | 115    |
C021-3T-2  | 100    |

Но теперь я хочу эти данные в DataGridView в формате ниже из Excelfile:

Test    |Energy-1|Energy-2|Energy-3 |
------------------------------------
C018-3L |113     |79      |89       |
C018-3L |90      |95      |NULL     |
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;
    }

Как этого добиться с помощью Group By?

1 Ответ

0 голосов
/ 21 февраля 2019

Я предоставлю ответ на основе SQL-сервера, поскольку ваш связанный вопрос задал этот вопрос.Здесь вы вообще не отметили свой вопрос [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)
,('C018-3L-4',90)
,('C018-3L-5',95)
,('C021-3T-1',115)
,('C021-3T-2',100);

SELECT p.*
FROM
(
    SELECT B.Code
          ,(B.Number-1)/3 AS Line
          ,CONCAT('Energy-',CASE B.Number % 3 WHEN 0 THEN 3 ELSE B.Number % 3 END) AS ColumnName
          ,Energy
    FROM @tbl t
    CROSS APPLY(SELECT LEN(t.Test) - CHARINDEX('-',REVERSE(t.Test))) A(PosLastHyphen)
    CROSS APPLY(SELECT LEFT(t.Test,PosLasthyphen) AS Code
                      ,CAST(SUBSTRING(t.Test,PosLastHyphen+2,10) AS INT) AS Number) B
) tbl
PIVOT
(
    MAX(Energy) FOR ColumnName IN([Energy-1],[Energy-2],[Energy-3])
) p
ORDER BY Code,Line;

Результат

+---------+------+----------+----------+----------+
| Code    | Line | Energy-1 | Energy-2 | Energy-3 |
+---------+------+----------+----------+----------+
| C018-3L | 0    | 113      | 79       | 89       |
+---------+------+----------+----------+----------+
| C018-3L | 1    | 90       | 95       | NULL     |
+---------+------+----------+----------+----------+
| C021-3T | 0    | 115      | 100      | NULL     |
+---------+------+----------+----------+----------+

Некоторые пояснения

Я использую CROSS APPLY для вычисления разделениявашего кода и бегущий номер.Затем я использую целочисленное деление для вычисления группы и оператор по модулю %, чтобы разбить это на три столбца.

...