Как предотвращать стоимость, удвоенную в консультации с Joins в той же таблице?

Я пробую реализовывать доклад продаж продуктов в месяц в PostgreSQL, у меня есть два подмостков documentoCab и documproductodet.

В таблице documentoCab я имею:

id          estado
--------------------
1            TRUE 

В таблице documproductodet я имею:

id     iddocumentocab      fecha
------------------------------------
1         1              21/01/2017 
2         1              12/01/2017
3         1              07/01/2017
4         1              07/02/2017
5         1              07/03/2017

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

Ene      Feb      Mar
----------------------
 1        4        5
 2       NULL    NULL
 3       NULL    NULL

Я использую следующую консультацию SQL:

SELECT 
        dpdEne.id Ene,
        dpdFeb.id Feb,
        dpdMar.id Mar

from documentocab dc

left join documproductodet dpdEne on dpdEne.iddocumentocab = dc.id and EXTRACT(MONTH FROM dpdEne.fecha)= 1 
left join documproductodet dpdFeb on dpdFeb.iddocumentocab = dc.id and EXTRACT(MONTH FROM dpdFeb.fecha)= 2 
left join documproductodet dpdMar on dpdMar.iddocumentocab = dc.id and EXTRACT(MONTH FROM dpdMar.fecha)= 3

Результат - следующий:

Ene      Feb      Mar
----------------------
 1        4        5
 2        4        5
 3        4        5

Идея состоит в том, чтобы появилась стоимость NULL, и не оценивай их повторенные.

3
задан 12.01.2017, 03:57
0 ответов

Редкое добро способ представлять данные, которых ты просишь, и я не понимаю хорошо намерение таблицы documentoCab. Но да возможно делать то, что ты просишь используя функцию окно ROW_NUMBER() чтобы определять в какой линии должен появляться реестр в особенности, сочетаемый с условными добавлениями для презентации в месяц:

with cte as (
  select dp.id,
         extract(month from dp.fecha) as month_id,
         row_number() over (
           partition by extract(month from dp.fecha)
           order by dp.id) as seq
    from documentoCab dc
    join documproductodet dp
      on dp.iddocumentocab = dc.id)
select max(case when month_id = 1 then id end) as Ene,
       max(case when month_id = 2 then id end) as Feb,
       max(case when month_id = 3 then id end) as Mar
  from cte
 group by seq
 order by seq

Результат:

Ene      Feb      Mar
----------------------
 1        4        5
 2       NULL    NULL
 3       NULL    NULL

Demo

Поскольку ты можешь видеть, нет необходимости делать join на каждый месяц, как ты это пробовал. И очень легко добавлять его остальные месяцы:

with cte as (
  select dp.id,
         extract(month from dp.fecha) as month_id,
         row_number() over (
           partition by extract(month from dp.fecha)
           order by dp.id) as seq
    from documentoCab dc
    join documproductodet dp
      on dp.iddocumentocab = dc.id)
select max(case when month_id = 1 then id end) as Ene,
       max(case when month_id = 2 then id end) as Feb,
       max(case when month_id = 3 then id end) as Mar,
       max(case when month_id = 4 then id end) as Abr,
       max(case when month_id = 5 then id end) as May,
       max(case when month_id = 6 then id end) as Jun,
       max(case when month_id = 7 then id end) as Jul,
       max(case when month_id = 8 then id end) as Ago,
       max(case when month_id = 9 then id end) as Sep,
       max(case when month_id = 10 then id end) as Oct,
       max(case when month_id = 11 then id end) as Nov,
       max(case when month_id = 12 then id end) as Dic
  from cte
 group by seq
 order by seq
1
ответ дан 03.12.2019, 17:45
  • 1
    Спасибо!! И хороший razó n, из-за которой pedí в así он был, потому что существует таблица má s названная продукт, который связывает с documproductodet , и он нуждался в том, чтобы сложить проданное количество каждого продукта в месяц и с формой, что tení в меня repetí an стоимость. –  12.01.2017, 06:40

Если то, что ты хочешь сделать, состоит в том, чтобы получать количество продаж, которые ты реализовал из-за каждого месяца. Выполни следующую консультацию в PostgreSQL:

SELECT COUNT(*) AS "Cantidad Vendida",   
    CASE date_part('month'::text, fecha)
        WHEN 1 THEN 'Enero'::text
        WHEN 2 THEN 'Febrero'::text
        WHEN 3 THEN 'Marzo'::text
        WHEN 4 THEN 'Abril'::text
        WHEN 5 THEN 'Mayo'::text
        WHEN 6 THEN 'Junio'::text
        WHEN 7 THEN 'Julio'::text
        WHEN 8 THEN 'Agosto'::text
        WHEN 9 THEN 'Septiembre'::text
        WHEN 10 THEN 'Octubre'::text
        WHEN 11 THEN 'Noviembre'::text
        WHEN 12 THEN 'Diciembre'::text
        ELSE NULL::text
    END AS mes From documproductodet dc
    WHERE date_part('year'::text, fecha) = 2017::double precision
    GROUP BY 
    CASE date_part('month'::text, fecha)
        WHEN 1 THEN 'Enero'::text
        WHEN 2 THEN 'Febrero'::text
        WHEN 3 THEN 'Marzo'::text
        WHEN 4 THEN 'Abril'::text
        WHEN 5 THEN 'Mayo'::text
        WHEN 6 THEN 'Junio'::text
        WHEN 7 THEN 'Julio'::text
        WHEN 8 THEN 'Agosto'::text
        WHEN 9 THEN 'Septiembre'::text
        WHEN 10 THEN 'Octubre'::text
        WHEN 11 THEN 'Noviembre'::text
        WHEN 12 THEN 'Diciembre'::text
        ELSE NULL::text
    END, date_part('year'::text, fecha)::integer

Результат, который бросает консультацию, - следующий:

introducir la descripción de la imagen aquí

Нужно отмечать, что в вышеупомянутой консультации уже я добавил в каждый месяц года, способа, в который они могли бы быть полезны.

0
ответ дан 03.12.2019, 17:45

Пробуй с

Select Distinct ...

Distinct используется, чтобы не показывать стоимость, удвоенную в консультации и пишется прямо SELECT.

-1
ответ дан 03.12.2019, 17:45
  • 1
    Привет спасибо за ответ, но используя DISTINCT он бросает мне те же результаты, даже пытаясь с SELECT DISTINCT ON... я не получаю ожидаемый результат. –  11.01.2017, 22:14

Теги

Похожие вопросы