首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在使用交叉应用时,我可以强制“空”记录出现吗?

在使用交叉应用时,我可以强制“空”记录出现吗?
EN

Database Administration用户
提问于 2017-02-20 22:11:16
回答 1查看 3.3K关注 0票数 4

我有一个非常有效的查询,只是我想强制一些记录出现。我使用的是SqlServer 2016,这个查询最终将在视图中使用,并由SSRS 2016使用。如果可以在SSRS中完成所需的行为,或者甚至更改为支点或其他类似的操作,则我愿意使用该选项。

我将在下面放置一些DDL,以模拟显示的示例图像。

我从其中提取的数据如下所示:

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

问题是,如上文所示,具有stateSUI_State为'IN‘的记录,其SUI_State为"OH“。这将导致输出不包含"IN“的SUI记录,因为没有记录具有"IN”的SUI_State1

有没有办法强迫“在雇员中”,“在雇主中”等等.出现值为0吗?

在许多状态下,State/SDI State和SUI State是不同的,所以我无法对其中的逻辑进行硬编码。

下面是一些与我当前查询类似的数据。这些值在这个问题中并不重要,只会迫使SUI记录出现在状态“in”中。

代码语言:javascript
复制
    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
EN

回答 1

Database Administration用户

回答已采纳

发布于 2017-02-21 02:32:09

您想要的是什么还不太清楚,但是将缺失的值添加到GROUP BY查询中的一种方法是将所有行添加到您的起始表中,为聚合列使用0或NULL。正如@RDFozz所指出的,如果要执行COUNT聚合,则需要使用NULL,否则结果会膨胀。但是,如果您只做SUM聚合并且不想麻烦COALESCE,那么0是一个很好的选择。

您可以使用UNION ALL完成这一任务。一项执行情况如下:

代码语言:javascript
复制
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;

我觉得这更接近你想要的?顶部结果集来自您在问题中的查询,下面的结果集是我的:

票数 2
EN
页面原文内容由Database Administration提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://dba.stackexchange.com/questions/164945

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档