умножать записи по строкам - pl / sql [duplicate]

TL; DR: Попробуйте использовать Html.Partial вместо Renderpage


Я получал Object reference not set to an instance of an object, когда пытался сделать вид в представлении, отправив ему модель, например это:

@{
    MyEntity M = new MyEntity();
}
@RenderPage("_MyOtherView.cshtml", M); // error in _MyOtherView, the Model was Null

Отладка показала, что модель была Null внутри MyOtherView. Пока я не сменил его на:

@{
    MyEntity M = new MyEntity();
}
@Html.Partial("_MyOtherView.cshtml", M);

И это сработало.

Кроме того, причина, по которой я не имел Html.Partial для начала, заключалась в том, что Visual Studio иногда выдает ошибки, (f9), если он находится внутри другого построенного цикла foreach, хотя это не ошибка:

@inherits System.Web.Mvc.WebViewPage
@{
    ViewBag.Title = "Entity Index";
    List<MyEntity> MyEntities = new List<MyEntity>();
    MyEntities.Add(new MyEntity());
    MyEntities.Add(new MyEntity());
    MyEntities.Add(new MyEntity());
}
<div>
    @{
        foreach(var M in MyEntities)
        {
            // Squiggly lines below. Hovering says: cannot convert method group 'partial' to non-delegate type Object, did you intend to envoke the Method?
            @Html.Partial("MyOtherView.cshtml");
        }
    }
</div>

Но я смог запустить приложение без проблем с этим " ошибка". Я смог избавиться от ошибки, изменив структуру цикла foreach, чтобы выглядеть так:

@foreach(var M in MyEntities){
    ...
}

Хотя я чувствую, что это потому, что Visual Studio неправильно интерпретировала амперсанды и скобки .

23
задан Konerak 24 March 2011 в 08:58
поделиться

7 ответов

По MUL вы имеете в виду прогрессивное умножение значений?

Даже при 100 строках небольшого размера (скажем, 10) ваш MUL (столбец) будет переполнять любой тип данных! С такой высокой вероятностью неправильного использования и ограниченного объема использования, он не должен быть стандартом SQL. Как показали другие, существуют математические способы его разработки, так же как есть много способов сделать сложные вычисления в SQL, используя стандартные (и общеупотребительные) методы.

Пример данных:

Column
1
2
4
8

COUNT : 4 items (1 for each non-null)
SUM   : 1 + 2 + 4 + 8 = 15
AVG   : 3.75 (SUM/COUNT)
MUL   : 1 x 2 x 4 x 8 ? ( =64 )

Для полноты реализации реализации ядра Oracle, MSSQL, MySQL *

Oracle : EXP(SUM(LN(column)))   or  POWER(N,SUM(LOG(column, N)))
MSSQL  : EXP(SUM(LOG(column)))  or  POWER(N,SUM(LOG(column)/LOG(N)))
MySQL  : EXP(SUM(LOG(column)))  or  POW(N,SUM(LOG(N,column)))
  • Уход при использовании EXP / LOG на SQL Server, посмотрите тип возврата http : //msdn.microsoft.com/en-us/library/ms187592.aspx
  • Форма POWER позволяет использовать большие числа (используя базы, большие, чем число Эйлера), и в тех случаях, когда результат слишком велик, чтобы вернуть его с помощью POWER, вы можете вернуть только логарифмическое значение и вычислить фактическое число вне запроса SQL

* LOG (0) и LOG (-ve) не определены. Ниже показано только, как обрабатывать это в SQL Server. Эквиваленты можно найти для других ароматов SQL, используя ту же концепцию

create table MUL(data int)
insert MUL select 1 yourColumn union all
           select 2 union all
           select 4 union all
           select 8 union all
           select -2 union all
           select 0

select CASE WHEN MIN(abs(data)) = 0 then 0 ELSE
       EXP(SUM(Log(abs(nullif(data,0))))) -- the base mathematics
     * round(0.5-count(nullif(sign(sign(data)+0.5),1))%2,0) -- pairs up negatives
       END
from MUL

Ингредиенты:

  • принимая abs () данных, если min равно 0, умножая на то, что еще бесполезно, результат равен 0
  • Когда данные равны 0, NULLIF преобразует его в null. Абс (), log () возвращают значение null, в результате чего он исключается из sum ()
  • Если данные не равны 0, abs позволяет нам использовать несколько отрицательных чисел с помощью метода LOG - мы будем продолжать отслеживание негативности в другом месте
  • . Выработка окончательного знака знака (данных) возвращает 1 for >0, 0 for 0 и -1 for <0. Добавим еще 0.5 и снова возьмем знак (), поэтому теперь мы классифицируем 0 и 1 как 1, а только -1 как -1. снова используйте NULLIF для удаления из COUNT () 1, так как нам нужно только подсчитать негативы. % 2 против count () отрицательных чисел возвращает либо -> 1, если есть нечетное число отрицательных чисел -> 0, если четное число отрицательных чисел больше математических трюков: мы принимаем 1 или 0 от 0,5 , так что приведенное выше становится -> (0.5-1=-0.5 => round до -1), если существует нечетное число отрицательных чисел -> (0.5-0= 0.5 => round to 1), если существует четное число отрицательных чисел числа мы умножаем этот окончательный 1 / -1 на значение SUM-PRODUCT для реального результата
36
ответ дан Will Ediger 1 September 2018 в 08:50
поделиться

Вы довольно быстро сломаете любой тип данных, поскольку числа монтируются вверх.

Использование LOG / EXP сложно из-за чисел & lt; = 0, которые будут сбой при использовании LOG. Я написал решение в этого вопроса , касающееся этого

1
ответ дан Community 1 September 2018 в 08:50
поделиться

С помощью PostgreSQL вы можете создавать свои собственные агрегатные функции, см. http://www.postgresql.org/docs/8.2/interactive/sql-createaggregate.html

Чтобы создать агрегатную функцию в MySQL, вам нужно будет создать файл .so (linux) или .dll (windows). Пример показан здесь: http://www.codeproject.com/KB/database/mygroupconcat.aspx

Я не уверен в mssql и oracle, но я ставлю они также имеют возможность создавать собственные агрегаты.

1
ответ дан Geeklab 1 September 2018 в 08:50
поделиться

Нет, но вы можете использовать математику:)

, если yourColumn всегда больше нуля:

select EXP(SUM(LOG(yourColumn))) As ColumnProduct from yourTable
22
ответ дан Konerak 1 September 2018 в 08:50
поделиться

Использование CTE в MS SQL:

CREATE TABLE Foo(Id int, Val int)
INSERT INTO Foo VALUES(1, 2), (2, 3), (3, 4), (4, 5), (5, 6)

;WITH cte AS 
(
    SELECT Id, Val AS Multiply, row_number() over (order by Id) as rn
    FROM Foo
    WHERE Id=1
    UNION ALL
    SELECT ff.Id, cte.multiply*ff.Val as multiply, ff.rn FROM
    (SELECT f.Id, f.Val, (row_number() over (order by f.Id)) as rn
    FROM Foo f) ff
        INNER JOIN cte
        ON ff.rn -1= cte.rn
)
SELECT * FROM cte
0
ответ дан LINQ2Vodka 1 September 2018 в 08:50
поделиться

Я вижу, что ответ Oracle по-прежнему отсутствует, поэтому вот он:

SQL> with yourTable as
  2  ( select 1 yourColumn from dual union all
  3    select 2 from dual union all
  4    select 4 from dual union all
  5    select 8 from dual
  6  )
  7  select EXP(SUM(LN(yourColumn))) As ColumnProduct from yourTable
  8  /

COLUMNPRODUCT
-------------
           64

1 row selected.

С уважением, Роб.

6
ответ дан Rob van Wijk 1 September 2018 в 08:50
поделиться

Не уверен насчет Oracle или sql-server, но в MySQL вы можете просто использовать *, как обычно.

mysql> select count(id), count(id)*10 from tablename;
+-----------+--------------+
| count(id) | count(id)*10 |
+-----------+--------------+
|       961 |         9610 |
+-----------+--------------+
1 row in set (0.00 sec)
-2
ответ дан Rob Williams 1 September 2018 в 08:50
поделиться
Другие вопросы по тегам:

Похожие вопросы: