Вам нужно сделать два COUNTIF и один COUNTIFS:
=COUNTIF(A:A,"<>")+COUNTIF(B:B,"<>")-COUNTIFS(A:A,"<>",B:B,"<>")
Или вам нужно ограничить диапазон данных, чтобы использовать SUMPRODUCT:
=SUMPRODUCT(--((A1:A1000<>"")+(B1:B1000<>"")>0))
Измените свою временную таблицу от #table до ##table в обоих местах.
Используя средства ## глобальная временная таблица, которая остается вокруг. Необходимо будет Отбросить его после того, как Вы выполните свою задачу.
Команда = "таблица отбрасывания ##table"
Я не думаю, что можно сделать временную таблицу в SQL путем, Вы думаете, так как он только существует в рамках запроса/хранимой процедуры, который создает его.
Если бы электронная таблица является стандартным форматом - значение, что Вы знаете столбцы, и они всегда - то же, Вы хотели бы составить Таблицу в SQL для помещения этого файла в. Существует очень быстрый способ сделать названный SqlBulkCopy
// Load the reports in bulk
SqlBulkCopy bulkCopy = new SqlBulkCopy(connectionString);
// Map the columns
foreach(DataColumn col in dataTable.Columns)
bulkCopy.ColumnMappings.Add(col.ColumnName, col.ColumnName);
bulkCopy.DestinationTableName = "SQLTempTable";
bulkCopy.WriteToServer(dataTable);
Но, если я понимаю Вашу проблему правильно, Вы не должны использовать SQL-сервер для изменения данных в DataTable. Вы c использование Реактивный двигатель для захвата данных для Вас.
// For CSV
connStr = string.Format("Provider=Microsoft.JET.OLEDB.4.0;Data Source={0};Extended Properties='Text;HDR=Yes;FMT=Delimited;IMEX=1'", Folder);
cmdStr = string.Format("SELECT * FROM [{0}]", FileName);
// For XLS
connStr = string.Format("Provider=Microsoft.JET.OLEDB.4.0;Data Source={0}{1};Extended Properties='Excel 8.0;HDR=Yes;IMEX=1'", Folder, FileName);
cmdStr = "select * from [Sheet1$]";
OleDbConnection oConn = new OleDbConnection(connStr);
OleDbCommand cmd = new OleDbCommand(cmdStr, oConn);
OleDbDataAdapter da = new OleDbDataAdapter(cmd);
oConn.Open();
da.Fill(dataTable);
oConn.Close();
Кроме того, в Вашем коде Вы спрашиваете, корректна ли Ваша строка подключения. Я не думаю, что это (но я мог быть неправым). Если Ваш не работает, пробуют это.
connectionString="Data Source=localhost\<instance>;database=<yourDataBase>;Integrated Security=SSPI" providerName="System.Data.SqlClient"
Помещение данных в базу данных займет время - так как у Вас уже есть он в памяти, возможно, LINQ к объектам (с DataSetExtensions) является Вашим другом? Замена <интервал> и т.д. с корректными типами...
var query = from row in table.Rows.Cast<DataRow>()
group row by new
{
Col1 = row.Field<int>(1),
Col2 = row.Field<int>(2)
} into grp
select new
{
Col1 = grp.Key.Col1,
Col2 = grp.Key.Col2,
SumCol7 = grp.Sum(x => x.Field<int>(7))
};
foreach (var item in query)
{
Console.WriteLine("{0},{1}: {2}",
item.Col1, item.Col2, item.SumCol7);
}
Простите мне, если я не понял то, что Вы точно хотите.
Если Вы хотите выполнить SQL-запрос на листе Excel, Вы могли бы сделать это непосредственно.
С другой стороны, можно использовать SQL Server для запросов Excel (OpenRowset или функция, которую я не помню сразу же). Используя это, можно присоединиться к таблице SQL-сервера с листом Excel
Предложение Marc является еще одним способом посмотреть на него.
Возможно, Вы могли использовать DataView. Вы создаете это из DataTable, который Вы уже имеете.
dv = new DataView(dataTableName);
Затем можно отфильтровать (примените оператор Where SQL), или отсортируйте данные с помощью методов DataView. Можно также использовать, Находят, чтобы найти, что строка соответствия или FindRows находит все строки соответствия.
Некоторые фильтры:
dv.RowFilter = "Country = 'USA'";
dv.RowFilter = "EmployeeID >5 AND Birthdate < #1/31/82#"
dv.RowFilter = "Description LIKE '*product*'"
dv.RowFilter = "employeeID IN (2,4,5)"
Сортировка:
dv.Sort = "City"
Нахождение строки: Найдите клиента по имени "John Smith".
vals(0)= "John"
vals(1) = "Smith"
i = dv.Find(vals)
где я - индекс строки, содержащей клиента.
После того как Вы применили их к DataView, можно связать сетку с DataView.