如何在 SQL GROUP BY 子句中返回空组

Jen*_*nni 6 sql sql-server sql-server-2005

我有一个查询来返回每个位置的合同内和合同外花费了多少,返回如下内容:

Location     | ContractStatus | Expenses
-------------+----------------+---------
New York     | Ad-hoc         | 2043.47
New York     | Contracted     | 2894.57
Philadelphia | Ad-hoc         | 3922.53
Seattle      | Contracted     | 2522.00
Run Code Online (Sandbox Code Playgroud)

问题是,对于所有临时或所有合同费用的位置,我只能得到一行。我想为每个位置取回两行,如下所示:

Location     | ContractStatus | Expenses
-------------+----------------+---------
New York     | Ad-hoc         | 2043.47
New York     | Contracted     | 2894.57
Philadelphia | Ad-hoc         | 3922.53
Philadelphia | Contracted     |    0.00
Seattle      | Ad-hoc         |    0.00
Seattle      | Contracted     | 2522.00
Run Code Online (Sandbox Code Playgroud)

有什么办法可以通过 SQL 完成此操作吗?这是我正在使用的实际查询(SQL Server 2005):

SELECT Location, 
     CASE WHEN Orders.Contract_ID IS NULL 
          THEN 'Ad-hoc' ELSE 'Contracted' END 
                     AS ContractStatus,
     SUM(OrderTotal) AS Expenses
FROM Orders
GROUP BY Location, 
    CASE WHEN Orders.Contract_ID IS NULL 
         THEN 'Ad-hoc' ELSE 'Contracted' END
ORDER BY Location ASC, ContractStatus ASC
Run Code Online (Sandbox Code Playgroud)

Cha*_*ana 3

是的,构造一个表达式,仅返回 adhoc 的 ordertotal,为其他返回 0,以及另一个执行相反操作的表达式,并对这些表达式求和。这将包括每个位置一行和两列,一列用于临时,一列用于合同...

 SELECT Location,  
     Sum(Case When Contract_ID Is Null Then OrderTotal Else 0 End) AdHoc,
     Sum(Case When Contract_ID Is Null Then 0 Else OrderTotal  End) Contracted
 FROM Orders 
 GROUP BY Location
Run Code Online (Sandbox Code Playgroud)

如果您确实想要为每个单独的行,那么一种方法是:

 SELECT Location, Min('AdHoc') ContractStatus,
     Sum(Case When Contract_ID Is Null 
              Then OrderTotal Else 0 End) OrderTotal
 FROM Orders 
 GROUP BY Location
 Union
 SELECT Location, Min('Contracted') ContractStatus,
     Sum(Case When Contract_ID Is Null 
              Then 0 Else OrderTotal  End) OrderTotal
 FROM Orders 
 GROUP BY Location
 Order By Location
Run Code Online (Sandbox Code Playgroud)