<?xml version='1.0' encoding="utf-8"?>
      <rss version='2.0'>
      <channel>
      <title>Форум на Исходниках.RU</title>
      <link>https://forum.sources.ru</link>
      <description>Форум на Исходниках.RU</description>
      <generator>Форум на Исходниках.RU</generator>
  	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=419086&amp;view=findpost&amp;p=3833478</guid>
        <pubDate>Mon, 29 Jun 2020 18:41:30 +0000</pubDate>
        <title>Оптимизировать запрос по месяцам</title>
        <link>https://forum.sources.ru/index.php?showtopic=419086&amp;view=findpost&amp;p=3833478</link>
        <description><![CDATA[Akina: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=419086&view=findpost&p=3833422'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>JoeUser &#064; <time class="tag-quote__quoted-time" datetime="2020-06-29T12:40:42+03:00">29.06.20, 09:40</time></span><div class='quote '>Возможности конечно гораздо беднее того же PostgreSQL.</div></div><br>
Зато SQLite может успешно работать и возвращать результат там, где PostgreSQL вообще не запустится.<br>
<br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=419086&view=findpost&p=3833428'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>JoeUser &#064; <time class="tag-quote__quoted-time" datetime="2020-06-29T10:57:18+00:00">29.06.20, 10:57</time></span><div class='quote '>Ну у меня это вылилось в некоторую долю дополнительного кода </div></div><br>
Код копеечный - тогда нормально.]]></description>
        <author>Akina</author>
        <category>Базы данных: SQL</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=419086&amp;view=findpost&amp;p=3833428</guid>
        <pubDate>Mon, 29 Jun 2020 10:57:18 +0000</pubDate>
        <title>Оптимизировать запрос по месяцам</title>
        <link>https://forum.sources.ru/index.php?showtopic=419086&amp;view=findpost&amp;p=3833428</link>
        <description><![CDATA[JoeUser: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=419086&view=findpost&p=3833421'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Akina &#064; <time class="tag-quote__quoted-time" datetime="2020-06-29T09:32:54+00:00">29.06.20, 09:32</time></span><div class='quote '>Особенно если средство отображения в программе не умеет само пивотить и требует дополнительного кода.</div></div><br>
Ну у меня это вылилось в некоторую долю дополнительного кода (Qt5/C++):<br>
<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">// ...</div><div class="code_line">int Max = 0;</div><div class="code_line">// 1) ►►► дополнительный вектор</div><div class="code_line">QVector&#60;int&#62; Res {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};</div><div class="code_line">// 2) ►►► дополнительный цикл перебора результирующих записей и заполнение вектора</div><div class="code_line">while (Query.next()) {</div><div class="code_line">&nbsp;&nbsp; &nbsp;QSqlRecord R = Query.record();</div><div class="code_line">&nbsp;&nbsp; &nbsp;Res[Query.value(R.indexOf(&quot;Month&quot;)).toInt() - 1] = Query.value(R.indexOf(&quot;Count&quot;)).toInt();</div><div class="code_line">&nbsp;&nbsp; &nbsp;if (Query.value(R.indexOf(&quot;Count&quot;)).toInt() &#62; Max)</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;Max = Query.value(R.indexOf(&quot;Count&quot;)).toInt();</div><div class="code_line">}</div><div class="code_line">// заполняем сет (максимум - выбираем ближайшим большим или равным, но кратным четырем)</div><div class="code_line">Max = ((Max + 3) / 4) * 4;</div><div class="code_line">AxisY-&#62;setRange(0, Max);</div><div class="code_line">// ?) ►►► значения берем не из Query.value(i).toInt() , а из Res[i]</div><div class="code_line">for (int i = 0; i &#60; 12; i++)</div><div class="code_line">&nbsp;&nbsp; &nbsp;BarSet-&#62;replace(i, Res[i]);</div><div class="code_line">// ...</div></ol></div></div></div></div><script>preloadCodeButtons('1');</script><br>
Я считаю, что оно того стоило&#33;]]></description>
        <author>JoeUser</author>
        <category>Базы данных: SQL</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=419086&amp;view=findpost&amp;p=3833422</guid>
        <pubDate>Mon, 29 Jun 2020 09:40:42 +0000</pubDate>
        <title>Оптимизировать запрос по месяцам</title>
        <link>https://forum.sources.ru/index.php?showtopic=419086&amp;view=findpost&amp;p=3833422</link>
        <description><![CDATA[JoeUser: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=419086&view=findpost&p=3833421'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Akina &#064; <time class="tag-quote__quoted-time" datetime="2020-06-29T09:32:54+00:00">29.06.20, 09:32</time></span><div class='quote '>Ну формально это можно и в запросе сделать - если затолкать твой запрос в CTE. Особенно если средство отображения в программе не умеет само пивотить и требует дополнительного кода.</div></div><br>
С особенностями SQLite 3 - знакомлюсь по ходу разработки. Возможности конечно гораздо беднее того же PostgreSQL. <br>
<br>
<span class="tag-color tag-color-named" data-value="mergepost" style="color: mergepost"><span class='tag-size' data-value='7' style='font-size:7pt;'>Добавлено <time class="tag-mergetime" datetime="2020-06-29T09:42:15+00:00">29.06.20, 09:42</time></span></span><br>
<div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=419086&view=findpost&p=3833417'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>Gonarh &#064; <time class="tag-quote__quoted-time" datetime="2020-06-29T08:26:11+00:00">29.06.20, 08:26</time></span><div class='quote '>Где ж ты раньше был.</div></div><br>
В смысле, я что-то сделал нетак? :)]]></description>
        <author>JoeUser</author>
        <category>Базы данных: SQL</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=419086&amp;view=findpost&amp;p=3833421</guid>
        <pubDate>Mon, 29 Jun 2020 09:32:54 +0000</pubDate>
        <title>Оптимизировать запрос по месяцам</title>
        <link>https://forum.sources.ru/index.php?showtopic=419086&amp;view=findpost&amp;p=3833421</link>
        <description><![CDATA[Akina: <div class='tag-quote'><a class='tag-quote-link' href='https://forum.sources.ru/index.php?showtopic=419086&view=findpost&p=3833410'><span class='tag-quote-prefix'>Цитата</span></a> <span class='tag-quote__quote-info'>JoeUser &#064; <time class="tag-quote__quoted-time" datetime="2020-06-29T07:50:11+00:00">29.06.20, 07:50</time></span><div class='quote '>А потом просто пробежаться по записям и собрать в своей проге вектор из 12 элементов.</div></div><br>
Ну формально это можно и в запросе сделать - если затолкать твой запрос в CTE. Особенно если средство отображения в программе не умеет само пивотить и требует дополнительного кода.]]></description>
        <author>Akina</author>
        <category>Базы данных: SQL</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=419086&amp;view=findpost&amp;p=3833417</guid>
        <pubDate>Mon, 29 Jun 2020 08:26:11 +0000</pubDate>
        <title>Оптимизировать запрос по месяцам</title>
        <link>https://forum.sources.ru/index.php?showtopic=419086&amp;view=findpost&amp;p=3833417</link>
        <description><![CDATA[Gonarh: Где ж ты раньше был.]]></description>
        <author>Gonarh</author>
        <category>Базы данных: SQL</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=419086&amp;view=findpost&amp;p=3833410</guid>
        <pubDate>Mon, 29 Jun 2020 07:50:11 +0000</pubDate>
        <title>Оптимизировать запрос по месяцам</title>
        <link>https://forum.sources.ru/index.php?showtopic=419086&amp;view=findpost&amp;p=3833410</link>
        <description><![CDATA[JoeUser: В общем, на SO, на примере убедили, что лучше вот такой запрос:<br>
<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">SELECT</div><div class="code_line">&nbsp;&nbsp;CAST(strftime(&#39;%m&#39;, datetime(Activity, &#39;unixepoch&#39;)) AS INTEGER) &nbsp;AS Month,</div><div class="code_line">&nbsp;&nbsp;COUNT(Activity) AS Count</div><div class="code_line">FROM Guests</div><div class="code_line">WHERE strftime(&#39;%Y&#39;, datetime(Activity, &#39;unixepoch&#39;)) = &#39;2020&#39;</div><div class="code_line">GROUP BY strftime(&#39;%m&#39;, datetime(Activity, &#39;unixepoch&#39;))</div></ol></div></div></div></div><br>
А потом просто пробежаться по записям и собрать в своей проге вектор из 12 элементов.<br>
Получается и красивше, и пожалуй, шустрее.]]></description>
        <author>JoeUser</author>
        <category>Базы данных: SQL</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=419086&amp;view=findpost&amp;p=3833407</guid>
        <pubDate>Mon, 29 Jun 2020 05:03:57 +0000</pubDate>
        <title>Оптимизировать запрос по месяцам</title>
        <link>https://forum.sources.ru/index.php?showtopic=419086&amp;view=findpost&amp;p=3833407</link>
        <description><![CDATA[JoeUser: Всем привет&#33;<br>
<br>
В таблице есть поле &quot;Activity&quot; в котором по факту записывается штамп времени. Мне нужно за определенный год (допустим 2020) вывести количество записей по месяцам. Результатом должна быть запись с 12-ю полями. Я составил вот такой запрос:<br>
<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">SELECT</div><div class="code_line">&nbsp;&nbsp;SUM(F1) &nbsp;AS &#39;M1&#39;,</div><div class="code_line">&nbsp;&nbsp;SUM(F2) &nbsp;AS &#39;M2&#39;,</div><div class="code_line">&nbsp;&nbsp;SUM(F3) &nbsp;AS &#39;M3&#39;,</div><div class="code_line">&nbsp;&nbsp;SUM(F4) &nbsp;AS &#39;M4&#39;,</div><div class="code_line">&nbsp;&nbsp;SUM(F5) &nbsp;AS &#39;M5&#39;,</div><div class="code_line">&nbsp;&nbsp;SUM(F6) &nbsp;AS &#39;M6&#39;,</div><div class="code_line">&nbsp;&nbsp;SUM(F7) &nbsp;AS &#39;M7&#39;,</div><div class="code_line">&nbsp;&nbsp;SUM(F8) &nbsp;AS &#39;M8&#39;,</div><div class="code_line">&nbsp;&nbsp;SUM(F9) &nbsp;AS &#39;M9&#39;,</div><div class="code_line">&nbsp;&nbsp;SUM(F10) AS &#39;M10&#39;,</div><div class="code_line">&nbsp;&nbsp;SUM(F11) AS &#39;M11&#39;,</div><div class="code_line">&nbsp;&nbsp;SUM(F12) AS &#39;M12&#39;</div><div class="code_line">FROM (</div><div class="code_line">&nbsp;&nbsp;SELECT</div><div class="code_line">&nbsp;&nbsp; &nbsp;CASE WHEN strftime(&#39;%m&#39;, datetime(G.Activity, &#39;unixepoch&#39;)) = &#39;01&#39; &nbsp;THEN COUNT(G.Activity) ELSE 0 END AS &#39;F1&#39;,</div><div class="code_line">&nbsp;&nbsp; &nbsp;CASE WHEN strftime(&#39;%m&#39;, datetime(G.Activity, &#39;unixepoch&#39;)) = &#39;02&#39; &nbsp;THEN COUNT(G.Activity) ELSE 0 END AS &#39;F2&#39;,</div><div class="code_line">&nbsp;&nbsp; &nbsp;CASE WHEN strftime(&#39;%m&#39;, datetime(G.Activity, &#39;unixepoch&#39;)) = &#39;03&#39; &nbsp;THEN COUNT(G.Activity) ELSE 0 END AS &#39;F3&#39;,</div><div class="code_line">&nbsp;&nbsp; &nbsp;CASE WHEN strftime(&#39;%m&#39;, datetime(G.Activity, &#39;unixepoch&#39;)) = &#39;04&#39; &nbsp;THEN COUNT(G.Activity) ELSE 0 END AS &#39;F4&#39;,</div><div class="code_line">&nbsp;&nbsp; &nbsp;CASE WHEN strftime(&#39;%m&#39;, datetime(G.Activity, &#39;unixepoch&#39;)) = &#39;05&#39; &nbsp;THEN COUNT(G.Activity) ELSE 0 END AS &#39;F5&#39;,</div><div class="code_line">&nbsp;&nbsp; &nbsp;CASE WHEN strftime(&#39;%m&#39;, datetime(G.Activity, &#39;unixepoch&#39;)) = &#39;06&#39; &nbsp;THEN COUNT(G.Activity) ELSE 0 END AS &#39;F6&#39;,</div><div class="code_line">&nbsp;&nbsp; &nbsp;CASE WHEN strftime(&#39;%m&#39;, datetime(G.Activity, &#39;unixepoch&#39;)) = &#39;07&#39; &nbsp;THEN COUNT(G.Activity) ELSE 0 END AS &#39;F7&#39;,</div><div class="code_line">&nbsp;&nbsp; &nbsp;CASE WHEN strftime(&#39;%m&#39;, datetime(G.Activity, &#39;unixepoch&#39;)) = &#39;08&#39; &nbsp;THEN COUNT(G.Activity) ELSE 0 END AS &#39;F8&#39;,</div><div class="code_line">&nbsp;&nbsp; &nbsp;CASE WHEN strftime(&#39;%m&#39;, datetime(G.Activity, &#39;unixepoch&#39;)) = &#39;09&#39; &nbsp;THEN COUNT(G.Activity) ELSE 0 END AS &#39;F9&#39;,</div><div class="code_line">&nbsp;&nbsp; &nbsp;CASE WHEN strftime(&#39;%m&#39;, datetime(G.Activity, &#39;unixepoch&#39;)) = &#39;10&#39; &nbsp;THEN COUNT(G.Activity) ELSE 0 END AS &#39;F10&#39;,</div><div class="code_line">&nbsp;&nbsp; &nbsp;CASE WHEN strftime(&#39;%m&#39;, datetime(G.Activity, &#39;unixepoch&#39;)) = &#39;11&#39; &nbsp;THEN COUNT(G.Activity) ELSE 0 END AS &#39;F11&#39;,</div><div class="code_line">&nbsp;&nbsp; &nbsp;CASE WHEN strftime(&#39;%m&#39;, datetime(G.Activity, &#39;unixepoch&#39;)) = &#39;12&#39; &nbsp;THEN COUNT(G.Activity) ELSE 0 END AS &#39;F12&#39;</div><div class="code_line">&nbsp;&nbsp;FROM Guests AS G</div><div class="code_line">&nbsp;&nbsp;WHERE strftime(&#39;%Y&#39;, datetime(G.Activity, &#39;unixepoch&#39;)) = &#39;2020&#39;</div><div class="code_line">&nbsp;&nbsp;GROUP BY strftime(&#39;%m&#39;, datetime(G.Activity, &#39;unixepoch&#39;))</div><div class="code_line">)</div></ol></div></div></div></div><br>
<br>
Запрос работает правильно. Но мне кажется, что он получился уж слишком громоздким. <br>
Можно ли его переписать/оптимизировать?]]></description>
        <author>JoeUser</author>
        <category>Базы данных: SQL</category>
      </item>
	
      </channel>
      </rss>
	