Построитель отчетов SQL: особенность видимости столбцов - PullRequest
0 голосов
/ 18 октября 2019

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

Вот мой отчет в «нормальном» виде. Параметры параметров: Продажи, Собранные и Оба, и сгруппированы по месяцам, как вы можете видеть: enter image description here

Когда я выбираю либо Собранные, либо Продажи по отдельности (Собранные в этом примере)это отбрасывает мою колонку «Октябрьская группа» и «Общая сумма»:

enter image description here

Вот где это становится странным ... если я снова нажму Просмотр отчета, я смогу увидетьданные, которые я хочу видеть во время загрузки, но они не выдаются так, как должны.

enter image description here

Однако есть еще более странные вещи. Я обнаружил, что если я изменю свой выбор даты, чтобы фактически не использовать сентябрь, то он работает нормально(@Start и @End переменные даты: я могу выбрать @Start как август, а @End как октябрь, без проблем. Но если либо @Start, либо @End действительно указывают сентябрь, то здесь возникают мои проблемы)

enter image description here

В запросе SQL нет ничего особенного в сентябрьских данных, которые могли бы вызвать проблему, но опубликует код на тот случай, если кто-нибудь захочет увидеть подтверждение.

USE PDI_Warehouse_2049_01

DECLARE @Salesperson VARCHAR(30)
    ,@Start DATE
    ,@End DATE
    ,@SalesType VARCHAR(30)
    ,@Customer VARCHAR(30)

SET @Salesperson = 'all'
SET @SalesType = 'all' --Options are CFN, Bulk, or All
SET @Start = '9/1/2019'
SET @End = '9/7/2019'
SET @Customer = 'all'

IF OBJECT_ID('tempdb..#temp') IS NOT NULL
    DROP TABLE #temp

IF OBJECT_ID('tempdb..#temp_collectedGM') IS NOT NULL
    DROP TABLE #temp_collectedGM;

IF OBJECT_ID('tempdb..#getsalesperson') IS NOT NULL
    DROP TABLE #getsalesperson

IF OBJECT_ID('tempdb..#CFN') IS NOT NULL
    DROP TABLE #CFN

IF OBJECT_ID('tempdb..#CFN_Bulk') IS NOT NULL
    DROP TABLE #CFN_Bulk;

--------------------------------------
--GET CFN VALUES
--------------------------------------
----1.First query gets list of salespeople associated to customers
SELECT DISTINCT c.Cust_Alias
    ,s.SalesPerson_Name
INTO #getsalesperson
FROM PDICompany_2049_01..CP_Transactions cp(NOLOCK)
INNER JOIN PDICompany_2049_01..Customers c(NOLOCK) ON CPTrn_Cust_Key = Cust_Key
LEFT JOIN PDICompany_2049_01..Customer_Sales_Info csi(NOLOCK) ON csi.CustSls_Cust_Key = c.Cust_Key
    AND CustSls_Salesperson_Key IS NOT NULL
LEFT JOIN PDICompany_2049_01..SalesPersons s ON csi.CustSls_Salesperson_Key = s.SalesPerson_Key
WHERE cp.CPTrn_Tran_Type != 0


-----2.Second query captures CFN values joining with #getsalesperson to bring it all together
-----NOTE: The GP originates as Sales GP. As it is collected, it remains the same value for Sales GP but becomes Collected GP as well.
SELECT DISTINCT c.Cust_Alias
    ,'CFN' AS [Prod Type]
    ,gsp.SalesPerson_Name
    ,case
        when datepart(year, ch.Chg_Last_Rcpt_Date) between datepart(year, @Start) AND datepart(year, @End) then datepart(year, ch.Chg_Last_Rcpt_Date)
        when datepart(year, cp.CPTrn_Business_Date) between datepart(year, @Start) AND datepart(year, @End) then datepart(year, cp.CPTrn_Business_Date)
        end as 'year'
    ,case
        when datepart(month, ch.Chg_Last_Rcpt_Date) between datepart(month, @Start) AND datepart(month, @End) then datepart(month, ch.Chg_Last_Rcpt_Date) 
        when datepart(month, cp.CPTrn_Business_Date) between datepart(month, @Start) AND datepart(month, @End) then datepart(month, cp.CPTrn_Business_Date)
        end as 'month'
    ,sum(CPTrn_Units) 'Gallons'
    ,CASE 
        WHEN si.Site_ID BETWEEN '2000'
                AND '2003'
            THEN sum(cp.CPTrn_Pretax_Ext_Amt) - sum(CPTrn_Ext_Cost)
        WHEN si.Site_ID BETWEEN '2900'
                AND '2999'
            THEN sum(cp.CPTrn_Total_Ext_Amt) - sum(CPTrn_Ext_Cost)
        END AS 'GP'
    ,sum(cp.CPTrn_Total_Ext_Amt) 'Sales w/tax'
    ,p.Prod_ID
    ,ch.Chg_Ref_No
    ,CASE 
        WHEN (datepart(year, ch.Chg_Last_Rcpt_Date) BETWEEN datepart(year, @Start)
                AND datepart(year, @End)
            AND datepart(month, ch.Chg_Last_Rcpt_Date) BETWEEN datepart(month, @Start)
                AND datepart(month, @End) 
                    or datepart(year, cp.CPTrn_Business_Date) BETWEEN datepart(year, @Start)
                AND datepart(year, @End)
            AND datepart(month, cp.CPTrn_Business_Date) BETWEEN datepart(month, @Start)
                AND datepart(month, @End))
            AND Chg_Status = 1
            THEN '1' 
        WHEN datepart(year, cp.CPTrn_Business_Date) BETWEEN datepart(year, @Start)
                AND datepart(year, @End)
            AND datepart(month, cp.CPTrn_Business_Date) BETWEEN datepart(month, @Start)
                AND datepart(month, @End)
            --AND Chg_Status = 0
            THEN '0'
        END AS 'status'
    INTO #CFN
FROM PDICompany_2049_01..CP_Transactions cp(NOLOCK)
INNER JOIN PDICompany_2049_01..Customers c(NOLOCK) ON CPTrn_Cust_Key = Cust_Key
INNER JOIN PDICompany_2049_01..Products p(NOLOCK) ON cp.CPTrn_Prod_Key = Prod_Key
LEFT JOIN PDICompany_2049_01..CP_Billing_Details CPBD(NOLOCK) ON CPBd.CPBillDtl_CPTrn_Key = cp.CPTrn_Key
    AND CPTrn_Cust_Key = CPBD.CPBillDtl_Cust_Key
    AND CPBD.CPBillDtl_Rec_Type = 1
LEFT JOIN PDICompany_2049_01..Customer_Locations cl(NOLOCK) ON c.Cust_WhPrcNtc_Def_CustLoc_Key = cl.CustLoc_Key
    AND ((CustLoc_Type & 2) <> 0)
LEFT JOIN #getsalesperson gsp ON c.Cust_Alias = gsp.Cust_Alias
LEFT JOIN PDICompany_2049_01..Charges ch(NOLOCK) ON ch.Chg_Ref_No = cpbd.CPBillDtl_Invoice_No
LEFT JOIN PDICompany_2049_01..Sites si(NOLOCK) ON si.Site_Key = cp.CPTrn_Site_Key
WHERE cp.CPTrn_Tran_Type != 0
    AND CPBillDtl_Invoice_No IS NOT NULL
    AND Salesperson_Name = CASE 
        WHEN @Salesperson IN (Salesperson_Name)
            THEN @Salesperson
        WHEN @Salesperson = 'All'
            THEN Salesperson_Name
        END
    AND c.Cust_Alias = CASE 
        WHEN @Customer IN (c.Cust_Alias)
            THEN @Customer
        WHEN @Customer = 'All'
            THEN c.Cust_Alias
        END
    and  ((datepart(year, ch.Chg_Last_Rcpt_Date) BETWEEN datepart(year, @Start) AND datepart(year, @End)
            AND datepart(month, ch.Chg_Last_Rcpt_Date) BETWEEN datepart(month, @Start) AND datepart(month, @End))
    or (datepart(year, cp.CPTrn_Business_Date) BETWEEN datepart(year, @Start) AND datepart(year, @End)
            AND datepart(month, cp.CPTrn_Business_Date) BETWEEN datepart(month, @Start) AND datepart(month, @End)))
    and CPBillDtl_Invoice_No is not null
    and ch.Chg_Ref_No is not null
GROUP BY c.Cust_Alias
    ,gsp.SalesPerson_Name
    ,datepart(year, ch.Chg_Last_Rcpt_Date)
    ,datepart(month, ch.Chg_Last_Rcpt_Date)
    ,datepart(year, cp.CPTrn_Business_Date)
    ,datepart(month, cp.CPTrn_Business_Date)
    ,ch.Chg_Ref_No
    ,p.Prod_ID
    ,cp.CPTrn_Key
    ,CPTrn_Ext_Cost
    ,si.Site_ID
    ,ch.Chg_Status
ORDER BY ch.Chg_Ref_No

-------------------------------------------------------------------
----GET BULK VALUES
-------------------------------------------------------------------
SELECT cu.Customer_Alias
    ,'Bulk' AS 'Prod Type'
    ,sp.SalesPerson_Name
    ,case
        when datepart(year, ch.Chg_Last_Rcpt_Date) between datepart(year, @Start) AND datepart(year, @End) then datepart(year, ch.Chg_Last_Rcpt_Date)
        when datepart(year, ch.chg_invoice_date) between datepart(year, @Start) and datepart(year, @End) then datepart(year, ch.chg_invoice_date)
        end as 'year'
    ,case
        when datepart(month, ch.Chg_Last_Rcpt_Date) between datepart(month, @Start) and datepart(month, @End) then datepart(month, ch.Chg_Last_Rcpt_Date)
        when datepart(month, ch.chg_invoice_date) between datepart(month, @Start) and datepart(month, @End) then datepart(month, ch.chg_invoice_date)
        end as 'month'
    ,CASE 
        WHEN p.Report_Group_Desc IN (
                'diesel'
                ,'gasoline'
                ,'aviation'
                ,'def'
                ,'kerosene'
                ,'propane'
                )
            OR p.Product_Id IN (
                'WEXALTERNATIVE'
                ,'WEXDEF'
                ,'WEXDSL'
                ,'WEXGAS'
                )
            OR p.Product_Id = CASE 
                WHEN cu.Customer_Alias = 'ONCOR ELECTRIC - WEX'
                    THEN 'WEXPURCHASES'
                WHEN cu.Customer_Alias = 'ONCOR ELECTRIC - WEX'
                    THEN 'WEXREBATE'
                END
            THEN sum(isnull(sales_qty, 0))
        ELSE 0
        END AS 'total gallons'
    ,sum(isnull(Ext_Retail_Base, 0) + isnull(Ext_Retail_Freight, 0)) - sum(isnull(Ext_Cost_Base, 0) + isnull(Ext_Cost_Freight, 0)) 'Sales GM'
    ,sum(isnull(Ext_Retail_Base, 0) + isnull(Ext_Retail_Freight, 0)) 'Sales'
    ,p.Product_Id
    ,fwsf.Invoice_Number
    ,CASE 
        WHEN (datepart(year, ch.Chg_Last_Rcpt_Date) BETWEEN datepart(year, @Start)
                AND datepart(year, @End)
            AND datepart(month, ch.Chg_Last_Rcpt_Date) BETWEEN datepart(month, @Start)
                AND datepart(month, @End)
                    or 
                datepart(year, ch.Chg_Invoice_Date) BETWEEN datepart(year, @Start)
                AND datepart(year, @End)
            AND datepart(month, ch.Chg_Invoice_Date) BETWEEN datepart(month, @Start)
                AND datepart(month, @End))
            AND Chg_Status = 1
            THEN '1'
        WHEN datepart(year, ch.Chg_Invoice_Date) BETWEEN datepart(year, @Start)
                AND datepart(year, @End)
            AND datepart(month, ch.Chg_Invoice_Date) BETWEEN datepart(month, @Start)
                AND datepart(month, @End)
            --AND Chg_Status = 0
            THEN '0'
        END AS 'status'
    INTO #temp
FROM PDI_Warehouse_2049_01.dbo.Fuel_Wholesale_Sales_Fact fwsf
JOIN PDI_Warehouse_2049_01.dbo.calendar c ON fwsf.Calendar_key = c.calendar_key
JOIN Salesperson sp ON sp.SalesPerson_Key = fwsf.Salesperson_Key
JOIN Customer cu ON fwsf.Customer_Key = cu.Customer_Key
JOIN PDI_Warehouse_2049_01..Petroleum_Product p ON p.Petroleum_Product_Key = fwsf.Petroleum_Product_Key
JOIN PDICompany_2049_01..Charges ch ON ch.Chg_Ref_No = fwsf.Invoice_Number
WHERE sp.Salesperson_Name = CASE 
        WHEN @Salesperson IN (Salesperson_Name)
            THEN @Salesperson
        WHEN @Salesperson = 'All'
            THEN Salesperson_Name
        END
    AND ((datepart(year, ch.Chg_Last_Rcpt_Date) BETWEEN datepart(year, @Start) AND datepart(year, @End)
            and datepart(month, ch.Chg_Last_Rcpt_Date) BETWEEN datepart(month, @Start) AND datepart(month, @End))
            or 
        (datepart(year, ch.Chg_Invoice_Date) BETWEEN datepart(year, @Start) AND datepart(year, @End)
            AND datepart(month, ch.Chg_Invoice_Date) BETWEEN datepart(month, @Start) AND datepart(month, @End)))
    and Invoice_Number is not null  
    --  AND isnull(fwsf.sales_qty, 0) != 0
    AND cu.Customer_Alias = CASE 
        WHEN @Customer IN (cu.Customer_Alias)
            THEN @Customer
        WHEN @Customer = 'All'
            THEN cu.Customer_Alias
        END
GROUP BY sp.SalesPerson_Name
    ,datepart(year, ch.Chg_Last_Rcpt_Date)
    ,datepart(month, ch.Chg_Last_Rcpt_Date)
    ,datepart(year, ch.chg_invoice_date)
    ,datepart(month, ch.chg_invoice_date)
    ,p.Report_Group_Desc
    ,p.Product_Id
    ,Invoice_Number
    ,cu.Customer_Alias
    ,p.Product_Id
    ,ch.Chg_Status
HAVING sum(isnull(sales_qty, 0)) != 0

---------------------------------------
----------final result--
-----------------------------------------
CREATE TABLE #CFN_Bulk (
    Customer_Alias VARCHAR(50)
    ,[Prod Type] VARCHAR(5)
    ,Salesperson_Name VARCHAR(50)
    ,year int
    ,month int
    ,[total gallons] FLOAT
    ,[Sales GM] FLOAT
    ,Sales FLOAT
    ,[Product_Id] VARCHAR(30)
    ,Invoice_Number VARCHAR(30)
    ,Chg_Status BIT
    );

INSERT INTO #CFN_Bulk
SELECT *
FROM #temp t

UNION ALL

SELECT *
FROM #CFN c;

SELECT Customer_Alias
    ,[Prod Type] 'Prod_Type'
    ,Salesperson_Name
    ,year
    ,month
    ,CASE 
        WHEN Chg_Status = 1
            THEN sum([total gallons])
        END AS 'Collected_gallons'
    ,CASE 
        WHEN Chg_Status = 0
            OR Chg_Status = 1
            THEN sum([total gallons])
        END AS 'Sold_gallons'
    ,Sales
    ,[Product_Id]
    ,Invoice_Number
    ,Chg_Status
    ,CASE 
        WHEN Chg_Status = 1
            THEN sum([Sales GM])
        END AS 'Collected_GM'
    ,CASE 
        WHEN Chg_Status = 0
            OR Chg_Status = 1
            THEN sum([Sales GM])
        END AS 'Sales_GM'
FROM #CFN_Bulk
WHERE [Prod Type] = CASE 
        WHEN @SalesType = 'CFN'
            THEN 'CFN'
        WHEN @SalesType = 'bulk'
            THEN 'Bulk'
        WHEN @SalesType = 'All'
            THEN [Prod Type]
        END
    AND Salesperson_Name = CASE 
        WHEN @Salesperson IN (Salesperson_Name)
            THEN @Salesperson
        WHEN @Salesperson = 'All'
            THEN Salesperson_Name
        END
    AND Customer_Alias = CASE 
        WHEN @Customer IN (Customer_Alias)
            THEN @Customer
        WHEN @Customer = 'All'
            THEN Customer_Alias
        END
    AND Salesperson_Name != 'undefined'
GROUP BY Customer_Alias
    ,[Prod Type]
    ,Salesperson_Name
    ,year
    ,month
    ,[total gallons]
    ,Sales
    ,[Product_Id]
    ,Invoice_Number
    ,Chg_Status
ORDER BY Invoice_Number

Будем весьма благодарны за любые идеи относительно того, что может быть причиной этого. Я действительно очень озадачен этим.


ОБНОВЛЕНИЕ 1: Выражения видимости столбцов очень просты. Вот пример одного для столбца Collected (поскольку выражение предопределено для скрытого представления):

=Parameters!View2.Value = "Sales"

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

...