Нужна помощь в преобразовании набора данных из нескольких строк в одну строку - PullRequest
2 голосов
/ 21 декабря 2011

У меня есть база данных (MySQL), в которой хранятся записи о затратах для некоторых наших клиентов (у каждого клиента разная стоимость товаров).Любая данная запись стоимости имеет эффективный диапазон дат (т. Е. Стоимость действительна для данного периода времени).Вот некоторые примеры данных:

Customer    ItemNumber    EffectDate    Counter    Cost
ABC123      ITEM101       2011-12-01          0    $1.00
ABC123      ITEM101       2011-12-10          0    $1.20
ABC123      ITEM101       2011-12-10          1    $1.25
DEF456      ITEM101       2011-11-15          0    $1.10
DEF456      ITEM101       2011-12-01          0    $1.12

Чтобы понять эти данные, переменная «Счетчик» - это количество раз, которое она была изменена (это из устаревшей платформы бухгалтерского учета), а дата - это«Дата начала» стоимости.Таким образом, ITEM101 для клиента ABC123 будет стоить 1,00 долл. США с 12/1/2011 и 12/12/2011, но, начиная с 12/10/2011, будет стоить 1,25 долл. (Будет 1,20 долл., Но счетчик вырос - т.е.стоимость сейчас составляет $ 1,25).Я надеюсь, что это имеет смысл.

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

Customer    ItemNumber    EffectiveBegin    EffectiveEnd    Cost
ABC123      ITEM101       2011-12-01        2011-12-09      $1.00
ABC123      ITEM101       2011-12-10        2099-12-31      $1.25
DEF456      ITEM101       2011-11-15        2011-11-30      $1.10
DEF456      ITEM101       2011-12-01        2099-12-31      $1.12

Где 31.12.2099 - просто дата заполнителядля "Текущий".

Любая помощь будет с благодарностью приветствуется !!

Ответы [ 2 ]

0 голосов
/ 21 декабря 2011

Я протестировал запрос, предложенный @xQbert, но он возвращает 5 строк для ваших примеров данных, а не четыре, как вы запросили.

Вот протестированный запрос, который возвращает четыре строки для ваших данных тестирования:

select p.Customer, p.ItemNumber, p.EffectDate, coalesce(e.effectdate - interval 1 day, curdate()) EffectiveEnd, p.Cost
from (
  select customer, itemnumber, effectdate, max(counter) counter
  from prices
  group by customer, itemnumber, effectdate
) c
left outer join prices p
  on p.customer = c.customer 
  and p.itemnumber = c.itemnumber 
  and p.effectdate = c.effectdate
  and p.counter = c.counter
left outer join prices e
  on e.customer = p.customer 
  and e.itemnumber = p.itemnumber 
  and e.effectdate > p.effectdate
  and e.counter = p.counter
0 голосов
/ 21 декабря 2011

UNTESTED: (читается как: у меня, вероятно, есть по крайней мере одна логическая ошибка и 2-3 синтаксических ошибки)

Areas where there might be problems:

    1) B.effectiveDate-1 - Hoping B.EffectDate-1 when B.EffectDate is null 
       will retrun null so coalesce will return 12/31/2099.
    2) '12/31/2099' may need to be cast to date data type.
    3) Hoping mySQL supports date-1 to subtract 1 day.
    4) Replace "TABLE" with your table name

Что это делает:

1) Joins to self in order to get begin & End for Effective dates. Excludes same
   date entries.
2) subtracts 1 from B.effectdate when customer item has multiple entries to 
   get "End"
3) Only joins records where customer, item match AND B.Counter is the MAX counter. 
   (Key if multiple entires)
4) Uses cost from B if exists, otherwise uses A.

Без лишних слов:

    Select A.Customer, A.ItemNumber, A.EffectDate as EffectiveBegin, 
            coalesce(B.effectDate-1,'12/31/2099') as EffectiveEnd, 
            coalesce(B.cost, A.cost) as Cost
    FROM Table A
    LEFT JOIN Table B 
      ON A.Customer=B.Customer 
     and A.ItemNumber = B.ItemNumber 
     and A.EffectDate < B.EffectDate
     and B.Counter = (SELECT max(C.Counter) 
                      FROM Table C 
                      WHERE C.Customer = A.customer 
                        and C.ItemNumber = A.ItemNumber)

Базовый обзор: Дайте мне стоимость и дату-1 наивысшей аффилированной записи B.Если нет записи b, используйте информацию о записи A для стоимости и 31.12.2099 для даты окончания.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...