我有一个非常有效的查询,只是我想强制一些记录出现。我使用的是SqlServer 2016,这个查询最终将在视图中使用,并由SSRS 2016使用。如果可以在SSRS中完成所需的行为,或者甚至更改为支点或其他类似的操作,则我愿意使用该选项。
我将在下面放置一些DDL,以模拟显示的示例图像。
我从其中提取的数据如下所示:

我使用的是交叉申请,以使总数垂直显示如下:

问题是,如上文所示,具有state和SUI_State为'IN‘的记录,其SUI_State为"OH“。这将导致输出不包含"IN“的SUI记录,因为没有记录具有"IN”的SUI_State1。
有没有办法强迫“在雇员中”,“在雇主中”等等.出现值为0吗?
在许多状态下,State/SDI State和SUI State是不同的,所以我无法对其中的逻辑进行硬编码。
下面是一些与我当前查询类似的数据。这些值在这个问题中并不重要,只会迫使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发布于 2017-02-21 02:32:09
您想要的是什么还不太清楚,但是将缺失的值添加到GROUP BY查询中的一种方法是将所有行添加到您的起始表中,为聚合列使用0或NULL。正如@RDFozz所指出的,如果要执行COUNT聚合,则需要使用NULL,否则结果会膨胀。但是,如果您只做SUM聚合并且不想麻烦COALESCE,那么0是一个很好的选择。
您可以使用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
复制相似问题