Sql-Server

使用交叉應用時,我可以強制顯示“空”記錄嗎?

  • July 10, 2021

我有一個執行良好的查詢,除了我想強制顯示一些記錄。我正在使用 SqlServer 2016,此查詢最終將在 VIEW 中使用並由 SSRS 2016 使用。如果可以在 SSRS 中完成所需的行為,甚至更改為 PIVOT 或類似的,我願意接受該選項。

我將在下面放一些 DDL 來模仿顯示的範例圖像。

我從中提取的數據如下所示:

在此處輸入圖像描述

我正在使用交叉應用使總數垂直顯示,如下所示:

在此處輸入圖像描述

問題是,如上所示,具有“IN”stateSUI_State“IN”的記錄具有SUI_State“OH”。這導致輸出不包含“IN”的 SUI 記錄,因為沒有記錄具有SUI_State1“IN”

有什麼方法可以強制“IN Employee SUI”、“IN Employer SUI”等…以 0 的值出現?

有許多狀態/SDI 狀態和 SUI 狀態不同的狀態,所以我不能硬編碼其中的邏輯。

這是我目前查詢的一些簡化的類似數據。這些值在這個問題中並不重要,只是強制 SUI 記錄出現在狀態“IN”中

   CREATE TABLE #EmployeeTaxes
(    Payroll int
   ,SDI_State char(2)
   ,SUI_State char(2)
   ,State char(2)
   ,SIT DECIMAl(19,2)
   ,Employee_SDI DECIMAL(19,2)
   ,Employer_SDI DECIMAL(19,2)
   ,Employee_SUI DECIMAL(19,2)
   ,Employer_SUI DECIMAL(19,2)
)

--Data in source table
INSERT INTO #EmployeeTaxes
VALUES   (4, 'IN', 'OH', 'IN', 50, 0, 0, 0, 100)
       ,(4, 'IN', 'OH', 'IN', 50, 0, 0, 0, 100)
       ,(4, 'IN', 'OH', 'IN', 50, 0, 0, 0, 100)
       ,(4, 'IN', 'OH', 'IN', 50, 0, 0, 0, 100)
       ,(4, 'IN', 'OH', 'IN', 50, 0, 0, 0, 100)
       ,(4, 'OH', 'OH', 'OH', 50, 0, 0, 0, 100)
       ,(4, 'OH', 'OH', 'OH', 50, 0, 0, 0, 100)
       ,(4, 'OH', 'OH', 'OH', 50, 0, 0, 0, 100)
       ,(4, 'OH', 'OH', 'OH', 50, 0, 0, 0, 100)


--My Current Query
SELECT Payroll
     ,v.Item                       AS [Witholding]
     ,SUM(v.TaxValue)              AS Tax  
     ,v.OrderByNumber              AS [OrderByNumber]
FROM #EmployeeTaxes
CROSS APPLY (
   VALUES ([STATE]   + ' SIT', SIT, [STATE] + '110')
         ,(SDI_STATE + ' Employee SDI', EMPLOYEE_SDI,SDI_STATE + '111')
         ,(SDI_STATE + ' Employer SDI', EMPLOYER_SDI,SDI_STATE + '112')
         ,(SUI_STATE + ' Employee SUI', EMPLOYEE_SUI,SUI_STATE + '113')
         ,(SUI_STATE + ' Employer SUI', EMPLOYER_SUI,SUI_STATE + '114A')
         ,(SUI_STATE + ' Total', EMPLOYEE_SUI + EMPLOYER_SUI, SUI_State + '114B')
         ,(SDI_STATE + ' Total', EMPLOYEE_SDI + EMPLOYER_SDI , SDI_State + '114B')
         ,('---------------------------------',NULL,[STATE] + '121')

) v (Item, TaxValue, OrderByNumber)
GROUP BY Payroll, OrderByNumber, v.Item
ORDER BY PAYROLL, OrderByNumber 
DROP TABLE #EmployeeTaxes

有點不清楚你在追求什麼,但是將缺失值添加到GROUP BY查詢中的一種方法是將所有行添加到起始表中,聚合列的值為 0 或 NULL。正如@RDFozz 指出的那樣,如果您正在進行COUNT聚合,您希望使用 NULL ,否則結果將被誇大。但是,如果您只進行SUM聚合併且不想打擾COALESCE.

您可以使用UNION ALL. 一種實現如下:

SELECT Payroll
     ,v.Item                       AS [Witholding]
     ,SUM(v.TaxValue)              AS Tax  
     ,v.OrderByNumber              AS [OrderByNumber]
FROM 
(
   SELECT * 
   FROM #EmployeeTaxes

   UNION ALL

   SELECT DISTINCT Payroll, [STATE], [STATE], [STATE], 0, 0, 0, 0, 0 
   FROM #EmployeeTaxes
) AS #EmployeeTaxes
CROSS APPLY (
   VALUES ([STATE]   + ' SIT', SIT, [STATE] + '110')
         ,(SDI_STATE + ' Employee SDI', EMPLOYEE_SDI,SDI_STATE + '111')
         ,(SDI_STATE + ' Employer SDI', EMPLOYER_SDI,SDI_STATE + '112')
         ,(SUI_STATE + ' Employee SUI', EMPLOYEE_SUI,SUI_STATE + '113')
         ,(SUI_STATE + ' Employer SUI', EMPLOYER_SUI,SUI_STATE + '114A')
         ,(SUI_STATE + ' Total', EMPLOYEE_SUI + EMPLOYER_SUI, SUI_State + '114B')
         ,(SDI_STATE + ' Total', EMPLOYEE_SDI + EMPLOYER_SDI , SDI_State + '114B')
         ,('---------------------------------',NULL,[STATE] + '121')

) v (Item, TaxValue, OrderByNumber)
GROUP BY Payroll, OrderByNumber, v.Item
ORDER BY PAYROLL, OrderByNumber;

我認為這更接近你想要的?頂部結果集來自您在問題中的查詢,底部結果集是我的:

結果集

引用自:https://dba.stackexchange.com/questions/164945