Подсчет экземпляров нескольких счетов и разворот на месте - PullRequest
0 голосов
/ 23 сентября 2019

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

CREATE TABLE billing
    ([bill_id] varchar(5), [bill_reference_id] varchar(8), [bill_date] date, [billing_type] varchar(1))
CREATE TABLE billing_detail
    ([bill_id] varchar(5), [accpac_category_type]  varchar(1), [location_id] varchar(1))
CREATE TABLE locations
    ([location_id] varchar(1), [location] varchar(50))
;

Счета могут иметь два типа биллинга I и C (счет и кредит).Может быть несколько счетов или кредитов для любого клиента (bill_reference_id) в любой день.

Я пытаюсь подсчитать количество нескольких счетов и кредитов на клиента в день по сравнению с количеством отдельных счетов на клиента в день (для целей данного упражнения кредит считается -1, а счет-фактура - 1).Есть несколько дополнительных критериев, одно из полей - accpac_category_type - должно попадать в указанные параметры.

Результирующий запрос должен быть «повернут» на несколько позиций.Просто чтобы сделать его немного сложнее, одно из расположений должно быть объединено с другим.

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

SELECT  main.date,
    SUM (CASE main.location WHEN 'Loc1' THEN main.single ELSE NULL END) as 'Loc1 Single',
    SUM (CASE main.location WHEN 'Loc1' THEN main.multiple ELSE NULL END) as 'Loc1 Multiple'
    .
    .
    .
    SUM (CASE main.location WHEN 'Loc4' THEN main.multiple ELSE NULL END) as 'Loc1 Multiple'
FROM (
    SELECT  sub.date,
    sub.location,
    SUM (CASE WHEN sub.Services<2 THEN 1 ELSE NULL END) as 'Single',
    SUM (CASE WHEN sub.Services>1 THEN 1 ELSE NULL END) as 'Multiple'
    FROM (
        SELECT  CAST(YEAR(bi.bill_date) AS VARCHAR(4)) + '-' + right('00' + CAST(MONTH(bi.bill_date) AS VARCHAR(2)), 2) AS 'Date',
        bi.bill_reference_id,
        CASE WHEN lo.location = 'Loc10' THEN Loc4' ELSE lo.location END as 'Location',
        SUM (CASE bi.billing_type WHEN 'I' THEN 1 ELSE -1 END) as 'Services'
        FROM    billing bi, billing_detail bd, locations lo
        WHERE   bi.bill_id = bd.bill_id AND bd.location_id = lo.location_id
        AND (bi.billing_type='I' OR bi.billing_type='C') 
        AND (bd.accpac_category_type='F' OR bd.accpac_category_type='S')
        GROUP BY
            CAST(YEAR(bi.bill_date) AS VARCHAR(4)) + '-' + right('00' + CAST(MONTH(bi.bill_date) AS VARCHAR(2)), 2),
            bi.bill_reference_id,
            location) AS sub
    GROUP BY
        date,
        location) as main
GROUP BY
    main.date
...