Как сгруппировать строки SQL по двум столбцам
GROUP BY использует сочетание ключей. Разберём повторяющиеся продажи, сумму по группе и фильтрацию результата.
SmartQuery · интерфейс
От вопроса к входным данным, коду и результату. Здесь собраны реальные элементы главной, каталога, поиска и статьи, их устройство и ограничения.
--page: #f2f6fc--surface: #ffffff--text: #101c2c--muted: #46576e--link: #254fff--border: #6b7e99--focus: #254fff--solid: #254fff--on-solid: #ffffff--accent: #d7ef54--on-accent: #101c2cТекст, ссылка, граница и кольцо фокуса имеют отдельные семантические роли. Ошибка объясняется словами, а не одним цветом.
--page: #101722--surface: #182438--text: #edf3fc--muted: #b6c5da--link: #83b6ff--border: #6f87a8--focus: #d7ef54--solid: #83b6ff--on-solid: #101722--accent: #d7ef54--on-accent: #101c2cТекст, ссылка, граница и кольцо фокуса имеют отдельные семантические роли. Ошибка объясняется словами, а не одним цветом.
ТЕМА · МЕТКА
Пояснение читается обычным текстом: DISTINCT удаляет повторения строк; GROUP BY собирает строки в группы.
SELECT department, COUNT(*)
FROM employees
GROUP BY department;| Токен | Значение |
|---|---|
| font-body | Plex,system-ui,sans-serif |
| font-code | PlexMono,ui-monospace,monospace |
| font-size | 18px |
| font-size-small | 17px |
| line-height | 1.7 |
| prose-measure | 62ch |
| code-size | 14px |
| code-size-small | 13px |
| Токен | Значение |
|---|---|
| gutter | 48px |
| radius | 4px |
| space | 8px |
| gutter-small | 20px |
| max-width | 1280px |
| rail-width | 208px |
| article-rail | 224px |
| control-height | 48px |
Колонка чтения ограничивает длину строки. Каталог использует боковую навигацию и список ответов; на узком экране порядок остаётся линейным. Широкие код и таблицы прокручиваются внутри своих регионов.
Настоящие адреса каталога доступны через нативные ссылки. Tab переносит фокус, Enter открывает страницу; текущий адрес отмечен aria-current.
Тот же компонент, что в шапке: Enter или пробел переключает Система → Светлая → Тёмная. Стрелки, Home и End выбирают режим напрямую. Выбор сохраняется между страницами.
Режимы по кругу: Система, Светлая, Тёмная. Enter или пробел переключают режим. Стрелки выбирают соседний, Home — Система, End — Тёмная.Это работающая форма с тем же поисковым индексом и скриптом, что на странице поиска. Введите вопрос, выберите тему или запрос без совпадений.
Заголовок вопроса → краткий ответ → разобранный пример → детали → связанный материал. Здесь используется тот же компонент примера, что и на реальных страницах.
Разбираем на примере / PostgreSQL / GROUP BY
| region | product | amount |
|---|---|---|
| East | Book | 10 |
| East | Book | 20 |
| West | Book | 5 |
SELECT region, product, SUM(amount) AS total
FROM sales
GROUP BY region, product
ORDER BY region, product;| region | product | total |
|---|---|---|
| East | Book | 30 |
| West | Book | 5 |
East / Book: 10 + 20 = 30. West / Book: одна строка, 5.
Разбираем на примере / PostgreSQL / NULL
Три аргумента: 10, NULL и 5.
SELECT LEAST(10, NULL, 5);5
NULL игнорируется, если есть обычные значения. Если все аргументы NULL, результат тоже NULL.
GROUP BY использует сочетание ключей. Разберём повторяющиеся продажи, сумму по группе и фильтрацию результата.
Где нужен восьмибитный тип и почему сумма двух Byte имеет тип Int.
Почему LEAST(10, NULL, 5) возвращает 5 и чем выбор значения отличается от MIN по строкам.
Byte: −27 ≤ x ≤ 27 − 1, то есть −128…127. Формула остаётся текстом и читается без изображения.
8 бит дают 256 различных битовых комбинаций. Знаковый Byte использует диапазон от −128 до 127.
Мобильное оглавление открывается клавишами Enter или Space; ссылки ведут к настоящим разделам этой страницы.
Справочник содержит восстановленные материалы. Сведения об источниках и границах восстановления доступны на странице о проекте.
В живом поиске выше доступны загрузка индекса, количество найденных материалов, пустой результат и объяснение ошибки загрузки. Нативная кнопка недоступна до готовности индекса; повторный поиск не требует отдельного демонстрационного действия.
Изображения в статьях сохраняют альтернативный текст. При отказе загрузки появляется объяснение и кнопка повторной попытки. Открыть материал со схемой Byte.
Подписи ниже связывают API с исходным модулем и настоящей страницей-потребителем. Это документация интерфейса; исходные Python-файлы не публикуются как файлы сайта.
link(href, label, css="", current=False)
Источник: src/shared/ui/primitives.py
button(label, disabled=False, kind="submit")
Источник: src/shared/ui/primitives.py
field(label, ident="q", name="q", value="", placeholder=...)
Источник: src/shared/ui/primitives.py
select_field(label, ident, options)
Источник: src/shared/ui/primitives.py
notice(title, text, kind="warning", demo=False)
Источник: src/shared/ui/primitives.py
code_block(code, label); code_scroll(markup, label)
Источник: src/shared/ui/primitives.py
data_table(headers, rows, caption=None); table_scroll(markup, label)
Источник: src/shared/ui/primitives.py
answer_row(answer, number)
Источник: src/entities/answers/summary.py
worked_example(example)
Источник: src/entities/answers/examples.py
pagination(base, page, total)
Источник: src/features/navigation/__init__.py
control(ident="site-theme"); head_script(); assets()
Источник: src/features/theme/__init__.py
stylesheet(); token_rows(); TOKENS: dict[str, dict[str, str]]
Источник: src/shared/styles/__init__.py
document(site: dict, title: str, body: str, path="/", description=None, page_kind="page")
Источник: src/widgets/site_shell/ui.py
document(...): общая композиция footer
Источник: src/widgets/site_shell/ui.py
breadcrumbs(category: str, slug: str) -> str
Источник: src/features/navigation/__init__.py
contents(items: list[tuple[id, title, level]], mobile=False) -> str
Источник: src/features/navigation/__init__.py
search_form(ident="search-form", value="", loading=False); search_filters(categories)
Источник: src/features/search/__init__.py
article_page(site, answer, articles); render_body(article)
Источник: src/pages/article/ui.py
render_body(article): исходные sup/sub, inline code и Unicode
Источник: src/entities/answers/body.py
figure_frame(markup: str, label: str); features.media assets()
Источник: src/shared/ui/primitives.py; src/features/media/client.js
source_label(source: dict); related_articles(article: dict, articles: list[dict])
Источник: src/entities/answers/relationships.py
Полная страница собирается из общей шапки, навигации, содержимого и подвала. Ссылки открывают настоящие композиции с теми же компонентами.
Знак и поиск → ориентир по темам → вопросы и короткие ответы → следующий шаг.
Заголовок → темы → строки ответов → страницы; адрес темы остаётся настоящей ссылкой.
Запрос → фильтр темы → статус загрузки/количество → результаты или объяснение пустого состояния.
Byte в Kotlin: диапазон, арифметика и массивы · Введение в PostgreSQL: установка, подключение и первые SQL-команды · LEAST в PostgreSQL: минимум из значений и NULL
Общая рамка: знак, поиск, кнопка оформления; затем хлебные крошки, заголовок и пояснение, содержание, тело ответа с кодом/таблицей и связанные вопросы. Примеры выше используют те же публичные функции.
Текущая ревизия источников: 83b477bd5541f2ceb00b4cfe5c6df92e37495788.