Получение данных за месяц, даже если они пусты - PullRequest
1 голос
/ 28 октября 2009

Я пытаюсь составить отчет на основе интеллектуального анализа данных нашего бухгалтерского программного обеспечения.

У нас есть таблица, в которой хранятся остатки по каждому счету в Главной книге за определенный период (0-12, перенесено 0 с прошлого года, 1-12 соответствует соответствующему месяцу), сумма и другие данные мне не нужны.

Я безуспешно пытаюсь получить значение для каждой учетной записи за каждый месяц, однако не всегда есть соответствующая запись. Я пробовал оставлять внешние соединения, перекрестные соединения, внутренние соединения, и не могу заставить его работать так, как я хочу. Я даже пытался выполнить левые внешние объединения с таблицей, содержащей «Initial» в качестве элемента 0 и 12 других записей, по одному имени на каждый месяц.

Вот пример данных:

Таблица GLBalances:

acct_no  |  post_prd  | post_trn_amt
  1011   |     0      |  -15000
  1011   |     1      |  5000
  1011   |     2      |  -6000
  1011   |     4      |  8000
  1020   |     5      |  100
  1020   |     12     |  300
  1011   |     9      |  500
  1011   |     8      |    0
etc...

То, что я хотел бы получить, это:

 acct_no | post_prd   | post_trn_amt
  1011   |     0      |  -15000
  1011   |     1      |  5000
  1011   |     2      |  -6000
  1011   |     3      |     0
  1011   |     4      |  8000
  1011   |     5      |     0
  1011   |     6      |     0
  1011   |     7      |     0
  1011   |     8      |     0
  1011   |     9      |   500
  1011   |     10     |     0
  1011   |     11     |     0
  1011   |     12     |     0
  1020   |     0      |     0
  1020   |     1      |     0
  1020   |     2      |     0
  1020   |     3      |     0
  1020   |     4      |     0
  1020   |     5      |     100
  1020   |     6      |     0
  1020   |     7      |     0
  1020   |     8      |     0
  1020   |     9      |     0
  1020   |    10      |     0
  1020   |    11      |     0
  1020   |    12      |     300

и т.д ...

Таким образом, в основном 13 записей для каждого акта за определенный год, даже если для этого периода нет записей.

Я уверен, что это намного проще, чем я, я просто изо всех сил, потому что я не имею дело с SQL на ежедневной основе. Любая помощь будет высоко ценится.

1 Ответ

6 голосов
/ 28 октября 2009

Вы можете создать лист действительных учетных записей и месяцев с перекрестным объединением. Найдите соответствующую «настоящую» строку с левым соединением, и вы настроены:

;with months as
(
    select 0 as Month
    union all
    select Month + 1 from months where Month < 12
)
select a.acct_no, m.month as post_prd, IsNull(g.post_trn_amt,0)
from months m
cross join (select  distinct acct_no from @GLBalances) a
left join @GLBalances g 
    on m.month = g.post_prd 
    and a.acct_no = g.acct_no
order by a.acct_no, m.month

Конструкция "with months as" - это причудливый способ создания таблицы, содержащей числа от 0 до 12. Вы также можете создать реальную таблицу, содержащую эти числа, и покончить с конструкцией "выражение рекурсивной общей таблицы".

Вот данные теста, которые я использовал:

declare @GLBalances table (acct_no int, post_prd int, post_trn_amt int)
insert into @GLBalances
select 1011,0,-15000
union all select 1011, 1, 5000
union all select 1011, 2, -6000
union all select 1011, 4, 8000
union all select 1020, 5, 100
union all select 1020, 12, 300
union all select 1011, 9, 500
union all select 1011, 8, 0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...