Oracle SQL:简化多个 select 语句
我需要对一年中的每个月进行计数,所以我这样做:
SELECT
(
SELECT COUNT( {ENCOMENDA_LINHA}.[Quantidade])
FROM (( {ENCOMENDA}
INNER JOIN {ENCOMENDA_LINHA} ON ( {ENCOMENDA}.[Id] = {ENCOMENDA_LINHA}.[EncomendaId] ))
INNER JOIN {PRODUTO} on ( {ENCOMENDA_LINHA}.[ProdutoId] = {PRODUTO}.[Id] ))
WHERE {ENCOMENDA}.[EstadoId] = @EstadoEncomenda AND
to_char({ENCOMENDA}.[DataSubmissao], 'MM') = '01' AND
{PRODUTO}.[ProdutoTipoId] = @TipoProduto
) AS jan,
(
SELECT COUNT( {ENCOMENDA_LINHA}.[Quantidade])
FROM (( {ENCOMENDA}
INNER JOIN {ENCOMENDA_LINHA} ON ( {ENCOMENDA}.[Id] = {ENCOMENDA_LINHA}.[EncomendaId] ))
INNER JOIN {PRODUTO} on ( {ENCOMENDA_LINHA}.[ProdutoId] = {PRODUTO}.[Id] ))
WHERE {ENCOMENDA}.[EstadoId] = @EstadoEncomenda AND
to_char({ENCOMENDA}.[DataSubmissao], 'MM') = '02' AND
{PRODUTO}.[ProdutoTipoId] = @TipoProduto
) AS fev,
(
SELECT COUNT( {ENCOMENDA_LINHA}.[Quantidade])
FROM (( {ENCOMENDA}
INNER JOIN {ENCOMENDA_LINHA} ON ( {ENCOMENDA}.[Id] = {ENCOMENDA_LINHA}.[EncomendaId] ))
INNER JOIN {PRODUTO} on ( {ENCOMENDA_LINHA}.[ProdutoId] = {PRODUTO}.[Id] ))
WHERE {ENCOMENDA}.[EstadoId] = @EstadoEncomenda AND
to_char({ENCOMENDA}.[DataSubmissao], 'MM') = '03' AND
{PRODUTO}.[ProdutoTipoId] = @TipoProduto
) AS mar,
(
SELECT COUNT( {ENCOMENDA_LINHA}.[Quantidade])
FROM (( {ENCOMENDA}
INNER JOIN {ENCOMENDA_LINHA} ON ( {ENCOMENDA}.[Id] = {ENCOMENDA_LINHA}.[EncomendaId] ))
INNER JOIN {PRODUTO} on ( {ENCOMENDA_LINHA}.[ProdutoId] = {PRODUTO}.[Id] ))
WHERE {ENCOMENDA}.[EstadoId] = @EstadoEncomenda AND
to_char({ENCOMENDA}.[DataSubmissao], 'MM') = '04' AND
{PRODUTO}.[ProdutoTipoId] = @TipoProduto
) AS abr,
(
SELECT COUNT( {ENCOMENDA_LINHA}.[Quantidade])
FROM (( {ENCOMENDA}
INNER JOIN {ENCOMENDA_LINHA} ON ( {ENCOMENDA}.[Id] = {ENCOMENDA_LINHA}.[EncomendaId] ))
INNER JOIN {PRODUTO} on ( {ENCOMENDA_LINHA}.[ProdutoId] = {PRODUTO}.[Id] ))
WHERE {ENCOMENDA}.[EstadoId] = @EstadoEncomenda AND
to_char({ENCOMENDA}.[DataSubmissao], 'MM') = '05' AND
{PRODUTO}.[ProdutoTipoId] = @TipoProduto
) AS mai,
(
SELECT COUNT( {ENCOMENDA_LINHA}.[Quantidade])
FROM (( {ENCOMENDA}
INNER JOIN {ENCOMENDA_LINHA} ON ( {ENCOMENDA}.[Id] = {ENCOMENDA_LINHA}.[EncomendaId] ))
INNER JOIN {PRODUTO} on ( {ENCOMENDA_LINHA}.[ProdutoId] = {PRODUTO}.[Id] ))
WHERE {ENCOMENDA}.[EstadoId] = @EstadoEncomenda AND
to_char({ENCOMENDA}.[DataSubmissao], 'MM') = '06' AND
{PRODUTO}.[ProdutoTipoId] = @TipoProduto
) AS jun,
(
SELECT COUNT( {ENCOMENDA_LINHA}.[Quantidade])
FROM (( {ENCOMENDA}
INNER JOIN {ENCOMENDA_LINHA} ON ( {ENCOMENDA}.[Id] = {ENCOMENDA_LINHA}.[EncomendaId] ))
INNER JOIN {PRODUTO} on ( {ENCOMENDA_LINHA}.[ProdutoId] = {PRODUTO}.[Id] ))
WHERE {ENCOMENDA}.[EstadoId] = @EstadoEncomenda AND
to_char({ENCOMENDA}.[DataSubmissao], 'MM') = '07' AND
{PRODUTO}.[ProdutoTipoId] = @TipoProduto
) AS jul,
(
SELECT COUNT( {ENCOMENDA_LINHA}.[Quantidade])
FROM (( {ENCOMENDA}
INNER JOIN {ENCOMENDA_LINHA} ON ( {ENCOMENDA}.[Id] = {ENCOMENDA_LINHA}.[EncomendaId] ))
INNER JOIN {PRODUTO} on ( {ENCOMENDA_LINHA}.[ProdutoId] = {PRODUTO}.[Id] ))
WHERE {ENCOMENDA}.[EstadoId] = @EstadoEncomenda AND
to_char({ENCOMENDA}.[DataSubmissao], 'MM') = '08' AND
{PRODUTO}.[ProdutoTipoId] = @TipoProduto
) AS ago,
(
SELECT COUNT( {ENCOMENDA_LINHA}.[Quantidade])
FROM (( {ENCOMENDA}
INNER JOIN {ENCOMENDA_LINHA} ON ( {ENCOMENDA}.[Id] = {ENCOMENDA_LINHA}.[EncomendaId] ))
INNER JOIN {PRODUTO} on ( {ENCOMENDA_LINHA}.[ProdutoId] = {PRODUTO}.[Id] ))
WHERE {ENCOMENDA}.[EstadoId] = @EstadoEncomenda AND
to_char({ENCOMENDA}.[DataSubmissao], 'MM') = '09' AND
{PRODUTO}.[ProdutoTipoId] = @TipoProduto
) AS stb,
(
SELECT COUNT( {ENCOMENDA_LINHA}.[Quantidade])
FROM (( {ENCOMENDA}
INNER JOIN {ENCOMENDA_LINHA} ON ( {ENCOMENDA}.[Id] = {ENCOMENDA_LINHA}.[EncomendaId] ))
INNER JOIN {PRODUTO} on ( {ENCOMENDA_LINHA}.[ProdutoId] = {PRODUTO}.[Id] ))
WHERE {ENCOMENDA}.[EstadoId] = @EstadoEncomenda AND
to_char({ENCOMENDA}.[DataSubmissao], 'MM') = '10' AND
{PRODUTO}.[ProdutoTipoId] = @TipoProduto
) AS out,
(
SELECT COUNT( {ENCOMENDA_LINHA}.[Quantidade])
FROM (( {ENCOMENDA}
INNER JOIN {ENCOMENDA_LINHA} ON ( {ENCOMENDA}.[Id] = {ENCOMENDA_LINHA}.[EncomendaId] ))
INNER JOIN {PRODUTO} on ( {ENCOMENDA_LINHA}.[ProdutoId] = {PRODUTO}.[Id] ))
WHERE {ENCOMENDA}.[EstadoId] = @EstadoEncomenda AND
to_char({ENCOMENDA}.[DataSubmissao], 'MM') = '11' AND
{PRODUTO}.[ProdutoTipoId] = @TipoProduto
) AS nov,
(
SELECT COUNT( {ENCOMENDA_LINHA}.[Quantidade])
FROM (( {ENCOMENDA}
INNER JOIN {ENCOMENDA_LINHA} ON ( {ENCOMENDA}.[Id] = {ENCOMENDA_LINHA}.[EncomendaId] ))
INNER JOIN {PRODUTO} on ( {ENCOMENDA_LINHA}.[ProdutoId] = {PRODUTO}.[Id] ))
WHERE {ENCOMENDA}.[EstadoId] = @EstadoEncomenda AND
to_char({ENCOMENDA}.[DataSubmissao], 'MM') = '12' AND
{PRODUTO}.[ProdutoTipoId] = @TipoProduto
) AS dez
FROM dual
有没有办法简化这个? 干杯。
I need to do a COUNT for each month in a year so I do this:
SELECT
(
SELECT COUNT( {ENCOMENDA_LINHA}.[Quantidade])
FROM (( {ENCOMENDA}
INNER JOIN {ENCOMENDA_LINHA} ON ( {ENCOMENDA}.[Id] = {ENCOMENDA_LINHA}.[EncomendaId] ))
INNER JOIN {PRODUTO} on ( {ENCOMENDA_LINHA}.[ProdutoId] = {PRODUTO}.[Id] ))
WHERE {ENCOMENDA}.[EstadoId] = @EstadoEncomenda AND
to_char({ENCOMENDA}.[DataSubmissao], 'MM') = '01' AND
{PRODUTO}.[ProdutoTipoId] = @TipoProduto
) AS jan,
(
SELECT COUNT( {ENCOMENDA_LINHA}.[Quantidade])
FROM (( {ENCOMENDA}
INNER JOIN {ENCOMENDA_LINHA} ON ( {ENCOMENDA}.[Id] = {ENCOMENDA_LINHA}.[EncomendaId] ))
INNER JOIN {PRODUTO} on ( {ENCOMENDA_LINHA}.[ProdutoId] = {PRODUTO}.[Id] ))
WHERE {ENCOMENDA}.[EstadoId] = @EstadoEncomenda AND
to_char({ENCOMENDA}.[DataSubmissao], 'MM') = '02' AND
{PRODUTO}.[ProdutoTipoId] = @TipoProduto
) AS fev,
(
SELECT COUNT( {ENCOMENDA_LINHA}.[Quantidade])
FROM (( {ENCOMENDA}
INNER JOIN {ENCOMENDA_LINHA} ON ( {ENCOMENDA}.[Id] = {ENCOMENDA_LINHA}.[EncomendaId] ))
INNER JOIN {PRODUTO} on ( {ENCOMENDA_LINHA}.[ProdutoId] = {PRODUTO}.[Id] ))
WHERE {ENCOMENDA}.[EstadoId] = @EstadoEncomenda AND
to_char({ENCOMENDA}.[DataSubmissao], 'MM') = '03' AND
{PRODUTO}.[ProdutoTipoId] = @TipoProduto
) AS mar,
(
SELECT COUNT( {ENCOMENDA_LINHA}.[Quantidade])
FROM (( {ENCOMENDA}
INNER JOIN {ENCOMENDA_LINHA} ON ( {ENCOMENDA}.[Id] = {ENCOMENDA_LINHA}.[EncomendaId] ))
INNER JOIN {PRODUTO} on ( {ENCOMENDA_LINHA}.[ProdutoId] = {PRODUTO}.[Id] ))
WHERE {ENCOMENDA}.[EstadoId] = @EstadoEncomenda AND
to_char({ENCOMENDA}.[DataSubmissao], 'MM') = '04' AND
{PRODUTO}.[ProdutoTipoId] = @TipoProduto
) AS abr,
(
SELECT COUNT( {ENCOMENDA_LINHA}.[Quantidade])
FROM (( {ENCOMENDA}
INNER JOIN {ENCOMENDA_LINHA} ON ( {ENCOMENDA}.[Id] = {ENCOMENDA_LINHA}.[EncomendaId] ))
INNER JOIN {PRODUTO} on ( {ENCOMENDA_LINHA}.[ProdutoId] = {PRODUTO}.[Id] ))
WHERE {ENCOMENDA}.[EstadoId] = @EstadoEncomenda AND
to_char({ENCOMENDA}.[DataSubmissao], 'MM') = '05' AND
{PRODUTO}.[ProdutoTipoId] = @TipoProduto
) AS mai,
(
SELECT COUNT( {ENCOMENDA_LINHA}.[Quantidade])
FROM (( {ENCOMENDA}
INNER JOIN {ENCOMENDA_LINHA} ON ( {ENCOMENDA}.[Id] = {ENCOMENDA_LINHA}.[EncomendaId] ))
INNER JOIN {PRODUTO} on ( {ENCOMENDA_LINHA}.[ProdutoId] = {PRODUTO}.[Id] ))
WHERE {ENCOMENDA}.[EstadoId] = @EstadoEncomenda AND
to_char({ENCOMENDA}.[DataSubmissao], 'MM') = '06' AND
{PRODUTO}.[ProdutoTipoId] = @TipoProduto
) AS jun,
(
SELECT COUNT( {ENCOMENDA_LINHA}.[Quantidade])
FROM (( {ENCOMENDA}
INNER JOIN {ENCOMENDA_LINHA} ON ( {ENCOMENDA}.[Id] = {ENCOMENDA_LINHA}.[EncomendaId] ))
INNER JOIN {PRODUTO} on ( {ENCOMENDA_LINHA}.[ProdutoId] = {PRODUTO}.[Id] ))
WHERE {ENCOMENDA}.[EstadoId] = @EstadoEncomenda AND
to_char({ENCOMENDA}.[DataSubmissao], 'MM') = '07' AND
{PRODUTO}.[ProdutoTipoId] = @TipoProduto
) AS jul,
(
SELECT COUNT( {ENCOMENDA_LINHA}.[Quantidade])
FROM (( {ENCOMENDA}
INNER JOIN {ENCOMENDA_LINHA} ON ( {ENCOMENDA}.[Id] = {ENCOMENDA_LINHA}.[EncomendaId] ))
INNER JOIN {PRODUTO} on ( {ENCOMENDA_LINHA}.[ProdutoId] = {PRODUTO}.[Id] ))
WHERE {ENCOMENDA}.[EstadoId] = @EstadoEncomenda AND
to_char({ENCOMENDA}.[DataSubmissao], 'MM') = '08' AND
{PRODUTO}.[ProdutoTipoId] = @TipoProduto
) AS ago,
(
SELECT COUNT( {ENCOMENDA_LINHA}.[Quantidade])
FROM (( {ENCOMENDA}
INNER JOIN {ENCOMENDA_LINHA} ON ( {ENCOMENDA}.[Id] = {ENCOMENDA_LINHA}.[EncomendaId] ))
INNER JOIN {PRODUTO} on ( {ENCOMENDA_LINHA}.[ProdutoId] = {PRODUTO}.[Id] ))
WHERE {ENCOMENDA}.[EstadoId] = @EstadoEncomenda AND
to_char({ENCOMENDA}.[DataSubmissao], 'MM') = '09' AND
{PRODUTO}.[ProdutoTipoId] = @TipoProduto
) AS stb,
(
SELECT COUNT( {ENCOMENDA_LINHA}.[Quantidade])
FROM (( {ENCOMENDA}
INNER JOIN {ENCOMENDA_LINHA} ON ( {ENCOMENDA}.[Id] = {ENCOMENDA_LINHA}.[EncomendaId] ))
INNER JOIN {PRODUTO} on ( {ENCOMENDA_LINHA}.[ProdutoId] = {PRODUTO}.[Id] ))
WHERE {ENCOMENDA}.[EstadoId] = @EstadoEncomenda AND
to_char({ENCOMENDA}.[DataSubmissao], 'MM') = '10' AND
{PRODUTO}.[ProdutoTipoId] = @TipoProduto
) AS out,
(
SELECT COUNT( {ENCOMENDA_LINHA}.[Quantidade])
FROM (( {ENCOMENDA}
INNER JOIN {ENCOMENDA_LINHA} ON ( {ENCOMENDA}.[Id] = {ENCOMENDA_LINHA}.[EncomendaId] ))
INNER JOIN {PRODUTO} on ( {ENCOMENDA_LINHA}.[ProdutoId] = {PRODUTO}.[Id] ))
WHERE {ENCOMENDA}.[EstadoId] = @EstadoEncomenda AND
to_char({ENCOMENDA}.[DataSubmissao], 'MM') = '11' AND
{PRODUTO}.[ProdutoTipoId] = @TipoProduto
) AS nov,
(
SELECT COUNT( {ENCOMENDA_LINHA}.[Quantidade])
FROM (( {ENCOMENDA}
INNER JOIN {ENCOMENDA_LINHA} ON ( {ENCOMENDA}.[Id] = {ENCOMENDA_LINHA}.[EncomendaId] ))
INNER JOIN {PRODUTO} on ( {ENCOMENDA_LINHA}.[ProdutoId] = {PRODUTO}.[Id] ))
WHERE {ENCOMENDA}.[EstadoId] = @EstadoEncomenda AND
to_char({ENCOMENDA}.[DataSubmissao], 'MM') = '12' AND
{PRODUTO}.[ProdutoTipoId] = @TipoProduto
) AS dez
FROM dual
Is there a way to simplify this?
Cheers.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
尝试:
包括一种相当通用的旋转结果的方法。请注意,由于年份没有限制,因此多年的数据可能会出现在每个月的结果中 - 这对于原始查询也是如此。
Try:
Includes a fairly generic method of pivoting the results. Note that since there is no restriction on year, data from multiple years could be appearing in each month's results - this would also be true of the original query.
这是枢轴操作。在 11G 中:
示例:
使用您的代码:
对于以前的版本,示例:
对于您的代码:
免责声明:未经测试。检查您语言中的月份短名称。
This is a pivot operation. In 11G:
sample:
with your code:
For previous version, sample:
for your code:
disclaimer: not tested. Check for month short names in your language.
创建一个包含所需值(月份和数量)的临时表。
然后从中选择您需要的内容。
Create a temporary table with the needed values (month and quantity).
And afterwords select what you need from it.