Информация

Последние записи

Теги


Блоги


Записи из всех блогов с тегом: sum


USE HINT и ASSUME_JOIN_PREDICATE_DEPENDS_ON_FILTERS

В этой публикации мне бы хотелось вернуться к подсказкам USE HINT, представленным впервые в SQL Server 2016 SP1. Часть из них мы уже рассмотрели в предыдущих статьях, в этой статье мы рассмотрим очередную подсказку – ASSUME_JOIN_PREDICATE_DEPENDS_ON_FILTERS, которая влияет на алгоритм оценки числа строк в соединениях.

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

Далее...
автор: SomewhereSomehow добавлено: 30 мар 19 просмотры: 484, комментарии: 0



Sum по disitnct полю , в другой колонке

Блог: Oracle SQL
Чалышев Максим Михайлович
Учебный тренинг. SQL от новичка до профессионала.
Бесплатные авторские видеокурсы SQL, PLSQL, JAVA
-- итак требуется найти сумму по distinct полю на основе идентификатора, который находится в другой колонке
-- е1сть доп условие нельзя использовать подзапрос, то есть необходимо выполнить задачу за одно обращение


-- подготовим данные для тестового примера
drop table t; -- если надо
create table t as
WITH r AS (
select /*+ materialize */ * from ALL_OBJECTS WHERE ROWNUM < 100 )
select object_id as id,length(r.object_name) as fid,
 (select count(1) from r a where length(r.object_name) = length(a.object_name))  as price   
from r


-- есть вторичный ключ fid от которого зависит значение в поле price
-- необходимо найти сумму по полю price в distinct поля fid одним запросом, то есть без вложенного select

select sum(price) sm from t 
-- это неправильное решение

select sum(distinct price) sm from t 
-- и это неправильное решение price может быть одинаковый для разных fid
-- надо как то так
select sum(price distinct fid) sm from t
-- но так написать нельзя

-- первое решение,
-- работает быстро, но решение не идеально, ключ может быть и не числовой
-- сумма Id + price - сумма id
-- , во избежание неприятностей использовали to_number(rpad(fid, 20)
select sum(distinct to_number(rpad(fid,10,'0')) +price) -  sum(distinct to_number(rpad(fid,10,'0'))) as sm  from t


-- решение второе - используем model
  select r from  t 
   model
   return updated rows   
   dimension by(id)
  measures(0 r, nullif(price, lag(price)over(partition by fid order by id)) lg)
  rules upsert(r[0] = sum(lg)[any])
автор: Myp3_u_K добавлено: 23 май 18 просмотры: 2325, комментарии: 1



USE HINT и ASSUME_MIN_SELECTIVITY_FOR_FILTER_ESTIMATES

В одной из предыдущих заметок мы говорили о таком механизме как Cardinality Estimator.
www.queryprocessor.ru
Cardinality Estimation, СЕ (оценка кардинальности) – это оценка предполагаемого числа строк, которое будет обработано тем или иным оператором запроса. Оценка – один из ключевых факторов при построении плана запроса. Оценку числа строк осуществляет компонент Cardinality Estimator.

Хинт ASSUME_MIN_SELECTIVITY_FOR_FILTER_ESTIMATES контролирует один из аспектов поведения этого компонента, а именно, оценку комплексных предикатов. На сегодняшний день SQL Server имеет три алгоритма оценки подобных предикатов:

  • оценка по предположению независимости;
  • оценка по минимальной селективности;
  • оценка по алгоритму exponential backoff.

Удобнее всего будет разобрать их на примере.

Читать дальше...
автор: SomewhereSomehow добавлено: 06 мар 17 просмотры: 2453, комментарии: 0



Model. SQL - высший пилотаж , имитация Excel

Блог: Oracle SQL
Чалышев Максим Михайлович
Авторский курс. SQL от новичка до профессионала. Бесплатное вводное занятие. Сертификат. Записывайся!
Прокачаю до уровня БОГ!


Оператор sql Model позволяет рассматривать результат запроса как многомерный массив
при этом в SQL задаем оси измерения этого массива (идентифицируем данные по осям)
использование Model, так же позволит нам подводить промежуточные и общие итоги, с применением агрегатных функции

SELECT *
FROM table1 -- таблица или запрос
MODEL DIMENSION BY (field1 , field2, ..)--оси, определение осей измерений по которым мы строим массив (поля для поиска уникальной ячейки)
    MEASURES (field3) -- определяющее поле 
    RULES (    cnt['res1', 'res2'] = res3 -- результат который вносится массив
            )  ORDER BY field1; -- сортировка по полю 


итак, нет ничего лучше для понимания сложной SQL конструкции, чем живой пример
продемонстрируем возможности model -- модели

create table pen(prt number, cnt number, color varchar2(15)); 
-- таблица(ручки) где (prt - партия поставки), cnt - количество в данной поставке, color - цвет ручек в поставке (red, green, black) )
-- заполним таблицу 
insert into pen(prt,cnt,color) values(1,5,'red');
insert into pen(prt,cnt,color) values(1,5,'black');
insert into pen(prt,cnt,color) values(2,3,'green');
insert into pen(prt,cnt,color) values(2,1,'red');
insert into pen(prt,cnt,color) values(3,1,'red');
insert into pen(prt,cnt,color) values(4,4,'black');
insert into pen(prt,cnt,color) values(7,3,'red');


определим измерения это color , prt

SELECT * FROM pen
MODEL DIMENSION BY (prt, color) -- измерения оси строим по полям prt, color  
    MEASURES (cnt) -- работаем с cnt 
    RULES (
        cnt[any, 'red'] = cnt[cv(prt), 'red'] * 10 -- для каждого prt и color = red - cnt в итговом запросе умножаем на 10
            )
ORDER BY prt;
--   	PRT	COLOR	CNT
--	1	black	5
--	1	red	50
--	2	red	10
--	2	green	3
--	3	red	10
--	4	black	4
--	7	red	30

-- добавим итоги
SELECT * FROM pen
MODEL DIMENSION BY (prt, color) -- измерения оси строим по полям prt, color  
    MEASURES (cnt) -- работаем с cnt 
    RULES (
        --cnt[any, 'red'] = cnt[cv(prt), 'red'] * 10, -- для каждого prt и color = red - cnt в итговом запросе умножаем на 10
        cnt[NULL, 'SUMM RED'] = sum(cnt)[ANY, 'red'], --  итог, только по red
        cnt[NULL, 'SUMM'] = sum(cnt)[ANY, ANY] -- общий итог 
            )
ORDER BY prt;

--     prt color cnt
--	1	red	5
--	1	black	5
--      2	green	3
--	2	red	1
--	3	red	1
--	4	black	4
--	7	red	3
--		SUMM RED	10
--		SUMM	32

читать дальше...
автор: Myp3_u_K добавлено: 02 июл 15 просмотры: 9213, комментарии: 0



TcxGrid - summary по условию, как подсчитать количество отмеченных CheckBox`ов

TcxGridDBTableView сгруппирован по двум полям.
Есть поле типа CheckBox, нужно посчитать количество включенных чекбоксов в каждой группе, в group summary.

1. В сетке открываем Summary/Groups.
2. Добавляем groups 1 шт.
3. Добавляем Items - здесь столько записей, сколько нужно отображать итогов, у меня по трём полям. Третье поле должно подсчитываться по условию.
4. В Linked columns выбираем те поля, по которым сгруппирована сетка, у меня по двум полям.
5. В Items выбираем нужную запись, у меня это та самая колонка типа CheckBox.
6. В инспекторе свойств указываем правильные значений свойств.
7. В свойстве Column выбираем колонку типа checkbox, в ней, в итогах (summary) будем отображать количество отмеченных переключателей.
8. В свойстве Kind указываем vkSum.
9. В свойстве Format указываем !9;0;0, иначе вместо положительных цифр будем иметь значение типа "-12,000", а должно быть просто "12".


Картинка с другого сайта.


Обсуждение здесь: http://www.sql.ru/forum/1041774-1/cxgrid-summary-po-usloviu


В итоге результат вот такой:

Картинка с другого сайта.
автор: X11 добавлено: 18 авг 13 просмотры: 4023, комментарии: 2



Как в cxGrid показать количество записей в группе и просуммировать значение поля?

Как в TcxGrid отобразить количество записей в группе и просуммировать значение поля по группам?

Как реализовать такое, как на картинке?
Картинка с другого сайта.

Реализация содержится в справке.
Ссылка для справочной системы Delphi 2007:
ms-help://borland.bds5/ExpressDataController.BDS5/ExpressDataController/Example_TcxDataSummary_OnAfterSummary.htm


procedure TForm1.Initialize;
var
  ASummaryItem: TcxDataSummaryItem;
begin
  //group by vendor
  DBTableView1VendorNo.GroupIndex := 0;
  DBTableView1VendorNo.Visible := False;
  with DBTableView1.DataController.Summary do
  begin
    BeginUpdate;
    try
      //set prefix and postfix for a group capion
      DefaultGroupSummaryItems.BeginText := '{';
      DefaultGroupSummaryItems.EndText := '}';
      //summary on ListPrice
      ASummaryItem := DefaultGroupSummaryItems.Add;
      ASummaryItem.Kind := skSum;
      ASummaryItem.ItemLink := DBTableView1ListPrice;
      ASummaryItem.Position := spFooter;
      //summary on Description
      ASummaryItem := DefaultGroupSummaryItems.Add;
      ASummaryItem.Kind := skCount;
      ASummaryItem.ItemLink := DBTableView1Description;
      ASummaryItem.Position := spFooter;
      //dummy summary on Description
      ASummaryItem := DefaultGroupSummaryItems.Add;
      ASummaryItem.Kind := skNone;
      ASummaryItem.ItemLink := DBTableView1Description;
      //subscribe to the OnAfterSummary event
      OnAfterSummary := MyAfterSummary;
    finally
      EndUpdate;
    end;
  end;
end;


procedure TForm1.MyAfterSummary(ASender: TcxDataSummary);
var
  AChildDataGroupsCount: Integer;
  AChildDataGroupIndex, AParentDataGroupIndex: TcxDataGroupIndex;
  AChildPosition: Integer;
begin
  //iterate through data groups at the level 0
  AParentDataGroupIndex := -1;
  with DBTableView1.DataController.Groups do
  begin
    AChildDataGroupsCount := ChildCount[AParentDataGroupIndex];
    for AChildPosition := 0 to AChildDataGroupsCount - 1 do
    begin
      //data group index of a child
      AChildDataGroupIndex := ChildDataGroupIndex[AParentDataGroupIndex, AChildPosition];
      CalculateGroupAverage(AChildDataGroupIndex);
    end;
  end;
end;



procedure TForm1.CalculateGroupAverage(ADataGroupIndex: TcxDataGroupIndex);
var
  AVarSum, AVarCount, AVarAverage: Variant;
begin
  with DBTableView1.DataController.Summary do
  begin
    //get sum of prices for specific data group
    //the second argument identifies a summary index in the
    //TcxDataSummary.DefaultGroupSummaryItems collection
    AVarSum := GroupSummaryValues[ADataGroupIndex, 0];
    //get records count in a group
    AVarCount := GroupSummaryValues[ADataGroupIndex, 1];
    if not (VarIsNull(AVarSum) or VarIsNull(AVarCount)) then
    begin
      AVarAverage := AVarSum / AVarCount;
      GroupSummaryValues[ADataGroupIndex, 2] := Format('%m / %d = %m', [Double(AVarSum), Integer(AVarCount), Double(AVarAverage)]);
    end;
  end;
end;
автор: X11 добавлено: 29 ноя 12 просмотры: 4826, комментарии: 0



Как SQL Server находит оборванные страницы и зачем он этим занимается.

Блог: sqlCmd Blog
Статья рассматривает систему контроля физической целостности данных реализованной в SQL Server. Исследуется проблематика вопроса и причины приведшие, в свое время, к появлению такой системы. Анализируются возможные режимы указанной системы и проводятся тесты на их "стрессоустойчивость". Выбирается лучший режим и дается обоснование такому выбору. Обсуждается взаимовлияние той же системы и резервных копий данных, как реальное, так и мнимое. Хотя статья и не фокусируется на вопросах ввода-вывода SQL Server как таковых, часть материала можно отнести и к этой теме. Уровень материала - 200.

Перейти к статье.
автор: SamMan добавлено: 23 апр 12 просмотры: 2003, комментарии: 1