2017-01-04 3 views
0

Как я уже сказал в названии, я хочу показать всю сумму (счета), сгруппированную по триместру и году, но если в одном триместре нет счетов как: триместр 2 сумма = 0Если год существует, заполните четыре триместра, даже если в течение месяца не было счетов

Мой запрос (что я пытаюсь):

select * from (

select "year",'1er Trimestre' as "Trimestre",COALESCE(sum("base"),0) as "base",COALESCE(sum("iva"),0) as "iva",COALESCE(sum("total"),0) as "total" from (Select Year("p_fpagado") as "year",month("p_fpagado") as "month",COALESCE(sum("im_base"),0) as "base",COALESCE(sum("im_calculado"),0) as "iva",COALESCE(sum("im_total"),0) as "total" from "Facturas" where "p_pagado" = True and month("p_fpagado") between 1 and 3 group by Year("p_fpagado"),month("p_fpagado")) group by "year" 

union all 

select "year",'2º Trimestre' as "Trimestre",COALESCE(sum("base"),0) as "base",COALESCE(sum("iva"),0) as "iva",COALESCE(sum("total"),0) as "total" from (Select Year("p_fpagado") as "year",month("p_fpagado") as "month",COALESCE(sum("im_base"),0) as "base",COALESCE(sum("im_calculado"),0) as "iva",COALESCE(sum("im_total"),0) as "total" from "Facturas" where "p_pagado" = True and month("p_fpagado") between 4 and 6 group by Year("p_fpagado"),month("p_fpagado")) group by "year" 

union all 

select "year",'3er Trimestre' as "Trimestre",COALESCE(sum("base"),0) as "base",COALESCE(sum("iva"),0) as "iva",COALESCE(sum("total"),0) as "total" from (Select Year("p_fpagado") as "year",month("p_fpagado") as "month",COALESCE(sum("im_base"),0) as "base",COALESCE(sum("im_calculado"),0) as "iva",COALESCE(sum("im_total"),0) as "total" from "Facturas" where "p_pagado" = True and month("p_fpagado") between 7 and 9 group by Year("p_fpagado"),month("p_fpagado")) group by "year" 

union all 

select "year",'4º Trimestre' as "Trimestre",COALESCE(sum("base"),0) as "base",COALESCE(sum("iva"),0) as "iva",COALESCE(sum("total"),0) as "total" from (Select Year("p_fpagado") as "year",month("p_fpagado") as "month",COALESCE(sum("im_base"),0) as "base",COALESCE(sum("im_calculado"),0) as "iva",COALESCE(sum("im_total"),0) as "total" from "Facturas" where "p_pagado" = True and month("p_fpagado") between 10 and 12 group by Year("p_fpagado"),month("p_fpagado")) group by "year" 
) 
order by 1 desc, 2 asc 

в результате, что я получаю это:

year Trimestre  base iva total 
2017 1er Trimestre 101  23  124 
2016 1er Trimestre 10  2.1 12.1 
2016 2º Trimestre 30  6.3 36.3 
2016 3er Trimestre 10  2.1 12.1 
2016 4º Trimestre 20  4.2 24.1 

И то, что я действительно хочу, это:

year Trimestre  base iva total 
2017 1er Trimestre 101  23  124 
2017 2º Trimestre 0  0  0 
2017 3er Trimestre 0  0  0 
2017 4º Trimestre 0  0  0 
2016 1er Trimestre 10  2.1 12.1 
2016 2º Trimestre 30  6.3 36.3 
2016 3er Trimestre 10  2.1 12.1 
2016 4º Trimestre 20  4.2 24.1 

Спасибо за чтение, я буду ждать вашей помощи :)

Совет: 1er Trimestre = первого триместра, 2º Trimestre = второй триместр, 3er Trimestre = 3-й триместр и 4º Trimestre = 4-й триместр ,

также попытался это:

select * from (

select "year",'1er Trimestre' as "Trimestre",COALESCE(sum("base"),0) as "base",COALESCE(sum("iva"),0) as "iva",COALESCE(sum("total"),0) as "total" from (Select Year("p_fpagado") as "year",month("p_fpagado") as "month",COALESCE(sum("im_base"),0) as "base",COALESCE(sum("im_calculado"),0) as "iva",COALESCE(sum("im_total"),0) as "total" from "Facturas" where "p_pagado" = True and month("p_fpagado") between 1 and 3 group by Year("p_fpagado"),month("p_fpagado")) group by "year" 

union all 

select "year",'2º Trimestre' as "Trimestre",COALESCE(sum("base"),0) as "base",COALESCE(sum("iva"),0) as "iva",COALESCE(sum("total"),0) as "total" from (Select Year("p_fpagado") as "year",month("p_fpagado") as "month",COALESCE(sum("im_base"),0) as "base",COALESCE(sum("im_calculado"),0) as "iva",COALESCE(sum("im_total"),0) as "total" from "Facturas" where "p_pagado" = True and month("p_fpagado") between 4 and 6 group by Year("p_fpagado"),month("p_fpagado")) group by "year" 

union all 

select "year",'3er Trimestre' as "Trimestre",COALESCE(sum("base"),0) as "base",COALESCE(sum("iva"),0) as "iva",COALESCE(sum("total"),0) as "total" from (Select Year("p_fpagado") as "year",month("p_fpagado") as "month",COALESCE(sum("im_base"),0) as "base",COALESCE(sum("im_calculado"),0) as "iva",COALESCE(sum("im_total"),0) as "total" from "Facturas" where "p_pagado" = True and month("p_fpagado") between 7 and 9 group by Year("p_fpagado"),month("p_fpagado")) group by "year" 

union all 

select "year",'4º Trimestre' as "Trimestre",COALESCE(sum("base"),0) as "base",COALESCE(sum("iva"),0) as "iva",COALESCE(sum("total"),0) as "total" from (Select Year("p_fpagado") as "year",month("p_fpagado") as "month",COALESCE(sum("im_base"),0) as "base",COALESCE(sum("im_calculado"),0) as "iva",COALESCE(sum("im_total"),0) as "total" from "Facturas" where "p_pagado" = True and month("p_fpagado") between 10 and 12 group by Year("p_fpagado"),month("p_fpagado")) group by "year" 
) as "datos" right outer join (select distinct '1er Trimestre' as "Trimestre" from "Facturas" 
union all 
select distinct '2º Trimestre' as "Trimestre" from "Facturas" 
union all 
select distinct '3er Trimestre' as "Trimestre" from "Facturas" 
union all 
select distinct '4º Trimestre' as "Trimestre" from "Facturas") as "trimestres" 
on "datos"."Trimestre" = "trimestres"."Trimestre" 
order by 1 desc, 2 asc 
+0

Какие dbms являются вы используете? – jarlh

+0

@jarlh Я использую HSQL (с базой OpenOffice) –

+0

Я бы создал таблицу trimestre с 4 строками, имеющими значения от 1 до 4. Внешнее соединение с этой таблицей! – jarlh

ответ

0

Это, наконец, работал !:

select "year","Trimestre",COALESCE(sum("base"),0) as "base",COALESCE(sum("iva"),0) as "iva",COALESCE(sum("total"),0) as "total" from (

select "year",'1er Trimestre' as "Trimestre",COALESCE(sum("base"),0) as "base",COALESCE(sum("iva"),0) as "iva",COALESCE(sum("total"),0) as "total" from (Select Year("p_fpagado") as "year",month("p_fpagado") as "month",COALESCE(sum("im_base"),0) as "base",COALESCE(sum("im_calculado"),0) as "iva",COALESCE(sum("im_total"),0) as "total" from "Facturas" where "p_pagado" = True and month("p_fpagado") between 1 and 3 group by Year("p_fpagado"),month("p_fpagado")) group by "year" 

union all 

select "year",'2º Trimestre' as "Trimestre",COALESCE(sum("base"),0) as "base",COALESCE(sum("iva"),0) as "iva",COALESCE(sum("total"),0) as "total" from (Select Year("p_fpagado") as "year",month("p_fpagado") as "month",COALESCE(sum("im_base"),0) as "base",COALESCE(sum("im_calculado"),0) as "iva",COALESCE(sum("im_total"),0) as "total" from "Facturas" where "p_pagado" = True and month("p_fpagado") between 4 and 6 group by Year("p_fpagado"),month("p_fpagado")) group by "year" 

union all 

select "year",'3er Trimestre' as "Trimestre",COALESCE(sum("base"),0) as "base",COALESCE(sum("iva"),0) as "iva",COALESCE(sum("total"),0) as "total" from (Select Year("p_fpagado") as "year",month("p_fpagado") as "month",COALESCE(sum("im_base"),0) as "base",COALESCE(sum("im_calculado"),0) as "iva",COALESCE(sum("im_total"),0) as "total" from "Facturas" where "p_pagado" = True and month("p_fpagado") between 7 and 9 group by Year("p_fpagado"),month("p_fpagado")) group by "year" 

union all 

select "year",'4º Trimestre' as "Trimestre",COALESCE(sum("base"),0) as "base",COALESCE(sum("iva"),0) as "iva",COALESCE(sum("total"),0) as "total" from (Select Year("p_fpagado") as "year",month("p_fpagado") as "month",COALESCE(sum("im_base"),0) as "base",COALESCE(sum("im_calculado"),0) as "iva",COALESCE(sum("im_total"),0) as "total" from "Facturas" where "p_pagado" = True and month("p_fpagado") between 10 and 12 group by Year("p_fpagado"),month("p_fpagado")) group by "year" 

union all 

(select distinct year("p_fpagado") as "year",'1er Trimestre' as "Trimestre",0 as "base",0 as "iva",0 as "total" from "Facturas" having year("p_fpagado") != 0 

union all 

select distinct year("p_fpagado") as "year",'2º Trimestre' as "Trimestre",0 as "base",0 as "iva",0 as "total" from "Facturas" having year("p_fpagado") != 0 

union all 

select distinct year("p_fpagado") as "year",'3er Trimestre' as "Trimestre",0 as "base",0 as "iva",0 as "total" from "Facturas" having year("p_fpagado") != 0 

union all 

select distinct year("p_fpagado") as "year",'4º Trimestre' as "Trimestre",0 as "base",0 as "iva",0 as "total" from "Facturas" having year("p_fpagado") != 0) 
) group by "year","Trimestre" order by "year" desc,"Trimestre" asc 

Я сделал еще один «Союз всех», а затем:

(select distinct year("p_fpagado") as "year",'1er Trimestre' as "Trimestre",0 as "base",0 as "iva",0 as "total" from "Facturas" having year("p_fpagado") != 0 

union all 

select distinct year("p_fpagado") as "year",'2º Trimestre' as "Trimestre",0 as "base",0 as "iva",0 as "total" from "Facturas" having year("p_fpagado") != 0 

union all 

select distinct year("p_fpagado") as "year",'3er Trimestre' as "Trimestre",0 as "base",0 as "iva",0 as "total" from "Facturas" having year("p_fpagado") != 0 

union all 

select distinct year("p_fpagado") as "year",'4º Trimestre' as "Trimestre",0 as "base",0 as "iva",0 as "total" from "Facturas" having year("p_fpagado") != 0) 
) 

То есть таблица с всеми годами, что существует в таблице, где я хочу, чтобы получить значение.

Тогда я сгруппировал все с «()» и выполнен в виде таблицы, чтобы выбрать оттуда -> «()» и выбрал следующую строку:

select "year","Trimestre",COALESCE(sum("base"),0) as "base",COALESCE(sum("iva"),0) as "iva",COALESCE(sum("total"),0) as "total" 

И я получил его. Спасибо всем за попытку помочь мне!

Надеюсь, этот ответ будет полезен любому, у кого есть аналогичная проблема. Хороший день :)

0

Попробуйте это ...

;WITH cteYears 
     AS 
     (
     SELECT [year] = 2016 
     UNION ALL SELECT [year] = 2017 
     ), 
     cteTrimestres 
     AS 
     (
     SELECT TID = 1, Trimestre = '1er Trimestre' 
     UNION ALL SELECT 2, '2º Trimestre' 
     UNION ALL SELECT 3, '3er Trimestre' 
     UNION ALL SELECT 4, '4º Trimestre' 
     ), 
     cteDataToAggregate 
     AS 
     (
     SELECT [year] = 2017, TID = 1, base = 101, iva = 23, total = 124 
     UNION ALL SELECT 2016, TID = 1, 10, 2.1, 12.1 
     UNION ALL SELECT 2016, TID = 2, 30, 6.3, 36.3 
     UNION ALL SELECT 2016, TID = 3, 10, 2.1, 12.1 
     UNION ALL SELECT 2016, TID = 4, 20, 4.2, 24.1 
     ), 
     cteDateRange 
     AS 
     (
     SELECT TID, [year], Trimestre 
      FROM cteYears 
       CROSS JOIN cteTrimestres 
     ) 
     SELECT dr.[year], 
      dr.Trimestre, 
      base = ISNULL(SUM(a.base), 0), 
      iva = ISNULL(SUM(a.iva), 0), 
      total = ISNULL(SUM(a.total), 0) 
      FROM cteDateRange AS dr 
       LEFT OUTER JOIN cteDataToAggregate AS a 
        ON dr.[year] = a.[year] 
        AND dr.TID = a.TID 
      GROUP BY dr.[year], 
       dr.Trimestre 
      ORDER BY [year] DESC, 
       Trimestre; 
+0

Привет, я пытаюсь поместить этот код в конец моей и программа дает мне ошибки «Неожиданный токен с». можете ли вы положить весь код, который должен работать, пожалуйста? (извините, я раньше не работал с предложением «с») –

+0

Конечно. Смотрите мой второй пост. Кстати, я тестирую этот код с помощью MS SQL Server, поэтому я не уверен, как он будет работать в HSQL. –

0

Вот та же самая логика без Common Table Expressions ...

SELECT cteDateRange.[year], 
     cteDateRange.Trimestre, 
     base = ISNULL(SUM(cteDataToAggregate.base), 0), 
     iva = ISNULL(SUM(cteDataToAggregate.iva), 0), 
     total = ISNULL(SUM(cteDataToAggregate.total), 0) 
     FROM (
      SELECT TID, [year], Trimestre 
       FROM ( 
        SELECT [year] = 2016 
        UNION ALL SELECT [year] = 2017 
        ) AS cteYears 
       CROSS JOIN (
        SELECT TID = 1, Trimestre = '1er Trimestre' 
        UNION ALL SELECT 2, '2º Trimestre' 
        UNION ALL SELECT 3, '3er Trimestre' 
        UNION ALL SELECT 4, '4º Trimestre' 
        ) AS cteTrimestres 
      ) AS cteDateRange 
      LEFT OUTER JOIN (
       SELECT [year] = 2017, TID = 1, base = 101, iva = 23, total = 124 
       UNION ALL SELECT 2016, TID = 1, 10, 2.1, 12.1 
       UNION ALL SELECT 2016, TID = 2, 30, 6.3, 36.3 
       UNION ALL SELECT 2016, TID = 3, 10, 2.1, 12.1 
       UNION ALL SELECT 2016, TID = 4, 20, 4.2, 24.1 
      ) AS cteDataToAggregate 
      ON cteDateRange.[year] = cteDataToAggregate.[year] 
      AND cteDateRange.TID = cteDataToAggregate.TID 
     GROUP BY cteDateRange.[year], 
      cteDateRange.Trimestre 
     ORDER BY [year] DESC, 
      Trimestre 
+0

Невозможно использовать ISNULL -> Доступ запрещен в инструкции ISNULL –

+0

Попробуйте заменить ISNULL COALESCE. –

+0

Исправлено, но теперь это давало следующее: Неожиданный союз, требуется из in statement [(полный запрос)] –

1

Это не полный ответ, так как вы не предоставляете данные таблицы образца. Вы можете сами разработать детали. HSQLDB имеет ряд функций, которые можно использовать для избежания длинных и сложных запросов.

Функции ГОДА (дата) и КВАРТАЛ (дата) могут использоваться для извлечения частей даты для группировки.

Ключевое слово UNNEST вместе с функцией SEQUENCE_ARRAY (начало, конец, интервал) может использоваться для генерации кварталов в случае, если данные пустые.

Первая часть представляет собой таблицу со списком кварталов:

SELECT YEAR(D) "y", QUARTER(D) "q", CASE QUARTER(D) WHEN 1 THEN '1st' WHEN 2 THEN '2nd' WHEN 3 THEN '3rd' WHEN 4 THEN '4th' END CASE "qname" 
FROM UNNEST(SEQUENCE_ARRAY(DATE'2016-01-01', DATE'2017-12-31' , 3 MONTH)) AS T(D) 

Вторая часть представляет собой простой запрос, чтобы получить все свои итоги и подсчитывает без меток:

SELECT YEAR("p_fpagado") as "year", QUARTER("p_fpagado") as "quarter", 
COALESCE(sum("im_base"),0) as "base",COALESCE(sum("im_calculado"),0) as "iva", 
COALESCE(sum("im_total"),0) as "total" from "Facturas" WHERE "p_pagado" = TRUE 
GROUP BY YEAR("p_fpagado"),QUARTER("p_fpagado") 

Тогда вам нужно LEFT ПРИСОЕДИНИТЕСЬ к вашей таблице в список кварталов и добавьте необходимые столбцы в список SELECT:

WITH list_of_quarters AS (SELECT ....), calculated_data AS (SELECT ....) 
SELECT "y", "qname", .... FROM list_of_quarters LEFT JOIN calculated_data ON (list_of_quarters."y" = calculated_data."year" AND list_of_quarters."q" = calculated_data."quarter") 
Смежные вопросы