Totais a partir de uma consulta
Tradução automática
Esta página foi traduzida automaticamente do inglês e ainda não foi revisada por um falante nativo; correções são bem-vindas no GitHub. Se algo não bater, vale o original em inglês. O código e os resultados são os mesmos do original, importados dos arquivos testados.
Tarefa: mostrar os totais de vendas por região sem consultar o banco duas vezes.
yaml
# Recipe: one query to the database, and totals computed from its result.
paths:
components: ./components
migrations: ./migrations
datasources:
db:
driver: sqlite
database: ./data/sales.dbsql
CREATE TABLE sales (
id INTEGER PRIMARY KEY AUTOINCREMENT,
region TEXT NOT NULL,
amount INTEGER NOT NULL
);
INSERT INTO sales (region, amount) VALUES
('North', 120), ('South', 80), ('North', 200), ('East', 50), ('South', 40);q:query source="sales" roda o seu SQL sobre o resultado da consulta chamada sales, que aparece como uma tabela com esse nome. queries="1" no teste confere que o banco foi consultado uma vez só.
xml
<q:component name="Sales">
<!-- The database is asked once. -->
<q:query name="sales" datasource="db">
SELECT region, amount FROM sales ORDER BY id
</q:query>
<!-- source="sales": SQL over that result, in memory — the table is
named after the query. -->
<q:query name="totals" source="sales">
SELECT region, SUM(amount) AS total, COUNT(*) AS n
FROM sales GROUP BY region ORDER BY total DESC
</q:query>
<ui:window title="Sales">
<ui:table source="{totals}">
<ui:column key="region" label="Region" />
<ui:column key="total" label="Total" />
<ui:column key="n" label="Sales" />
</ui:table>
<ui:text>{sales_result.recordCount} sales</ui:text>
</ui:window>
</q:component>xml
<q:test name="totals by region, from one query" page="/">
<test:visit />
<test:expect text="North 320 2 South 120 2 East 50 1" />
<test:expect text="5 sales" />
<test:expect queries="1" />
</q:test>text
tests/totals.test.q
PASS totals by region, from one query
1 passed, 0 failedVeja DB-3.