0

会計月ごとに顧客ごとの売上を取得するクエリがあります。ただし、特定の月に購入しなかった顧客が何人かいます。このような状況では、MonthNum フィールドの SalesDlr 値を 0 にしたいのですが、MonthNum 値は実際の月番号である必要があります。現在、以下のクエリで MonthNum 値を取得していません。

SELECT
    a.Customer,
    a.CustomerName,
    a.MonthNum,
    a.FiscalYear,
    a.SalesDlr
FROM
(SELECT
    sd.SBCUST AS Customer,
    sd.RMNAME AS CustomerName,
    fc.FiscalMonthNum AS MonthNum,
    fc.FiscalYear,
    SUM(sd.SBEPRC) AS SalesDlr
FROM
    dbo.SalesData sd
    LEFT OUTER JOIN dbo.FiscalCalendar fc ON fc.FiscalDate = sd.SBINDT
WHERE
    sd.SBTYPE = 'O'
AND
    sd.SBINDT > '2012-12-31'
AND
    sd.SBCLS NOT IN ('1500')
GROUP BY
    sd.SBCUST,
    sd.RMNAME,
    fc.FiscalMonthNum,
    fc.FiscalYear
)a
GROUP BY
    a.Customer,
    a.CustomerName,
    a.MonthNum,
    a.FiscalYear,
    a.SalesDlr
ORDER BY
    a.Customer,
    a.MonthNum,
    a.FiscalYear

どうすれば修正できますか?

4

1 に答える 1

1

あなたの SalesData には、毎月すべての顧客が登録されているわけではないと推測しています。Curtis という顧客が 5 月に購入しなかった場合、SalesData に 5 月のエントリがない可能性があります。したがって、左側の SalesData との結合を終了すると、Curtis には 5 月の行がありません。

左結合の順序を入れ替えても、行方不明の顧客に対して 1 つの日付しか生成されないため、十分ではありません。したがって、個別の顧客と個別の月の間のクロス結合が本当に必要であり、それらの合計を取得します。

with FilteredSalesData as (
    SELECT  
        sd.SBCUST as Customer,
        sd.RMName as CustomerName,
        sd.SBEPRC,
        fc.FiscalMonthNum as MonthNum,
        fc.FiscalYear
    FROM dbo.SalesData sd
    join FiscalCalendar fc ON fc.FiscalDate = sd.SBINDT
        WHERE
            sd.SBTYPE = 'O'
        AND
            sd.SBCLS NOT IN ('1500')
), DistinctCustomers as (
    select distinct 
        SBCUST as Customer,
        RMName as CustomerName
    from FilteredSalesData
), DistinctMonths as (
    select distinct
        FiscalMonthNum as MonthNum,
        FiscalYear
    From FiscalCalendar
    WHERE FiscalDate > '2012-12-31'
)
select
    Customer,
    CustomerName,
    MonthNum,
    FiscalYear,
    SUM(sd.SBEPRC) as SalesDlr
From DistinctCustomers dc
CROSS JOIN DistinctMonths dm
left Join FilteredSalesData sd 
    on sd.customer = dc.Customer 
    and sd.CustomerName = dc.CustomerName
    and sd.MonthNum = dm.MonthNum
    and sd.FiscalYear = dm.FiscalYear
group by Customer, CustomerName, MonthNum, FiscalYear
order by Customer, MonthNum, FiscalYear
于 2013-06-21T00:28:32.093 に答える