如果没有返回数据,如何返回0的行?

won*_*t77 3 sql t-sql sql-server-2005

我有一个查询,我试图显示行无论如何.如果返回了一些数据,查询会返回正确的信息,但是如果所有行都为空,我显然什么都没有,而且没有什么,如果没有,我需要一行返回0.

我已经尝试使用isnull()coalesce()解释这一点,但显然我做得不对.下面是我需要为此目的调整的基本查询.

SELECT
    Vendor
    ,SUM(TotalAssigned) as 'Total Production Assigned Not Completed'
    ,SUM(AssignedFees) as 'Work in process Fees'
    ,SUM(TotalSubmitted) as 'Total Production Submitted'
    ,SUM(SubmittedFees) as 'Submitted Production Fees'
FROM(
    SELECT
        distinct 
        v.ContactFirstName+' '+v.ContactLastName AS Vendor
        ,oi.orderid, oi.orderitemid
        ,CASE WHEN  oi.QueueID > 0 and oi.lastmilestoneid < 70 THEN 1 ELSE 0 END AS TotalAssigned
        ,CASE WHEN  oi.QueueID > 0 and oi.lastmilestoneid < 70 THEN dbo.GetAdjustedVendorFee(oi.OrderID, oi.OrderItemID) END AS AssignedFees
        ,CASE WHEN oim.MilestoneID = 70 THEN 1 ELSE 0 END AS TotalSubmitted
        ,CASE WHEN oim.MilestoneID = 70 THEN dbo.GetAdjustedVendorFee(oi.OrderID, oi.OrderItemID) END AS SubmittedFees

    FROM
    OrderItems oi
    LEFT JOIN OrderItemMilestones oim ON oim.OrderID = oi.OrderID and oim.OrderItemID = oi.OrderItemID
    LEFT JOIN Vendors v ON v.VendorID = oi.VendorID
    WHERE
    oim.MilestoneDate BETWEEN dbo.TruncateDate(dateadd(dd, -1, Current_Timestamp)) and dbo.TruncateDate(Current_Timestamp)
    and oi.VendorID in (105144) 
    and oi.productid not in (105)
)x

GROUP BY Vendor
Run Code Online (Sandbox Code Playgroud)

Con*_*rix 7

一种方法是将表达式包装在CTE中然后用UNION ALL它包装

UNION ALL SELECT NULL, 0,0,0,0 WHERE NOT EXISTS(SELECT * FROM CTE)

例如

WITH CTE AS 
(SELECT
    Vendor
    ,SUM(TotalAssigned) as 'Total Production Assigned Not Completed'
    ,SUM(AssignedFees) as 'Work in process Fees'
    ,SUM(TotalSubmitted) as 'Total Production Submitted'
    ,SUM(SubmittedFees) as 'Submitted Production Fees'
FROM(
    SELECT
        distinct 
        v.ContactFirstName+' '+v.ContactLastName AS Vendor
        ,oi.orderid, oi.orderitemid
        ,CASE WHEN  oi.QueueID > 0 and oi.lastmilestoneid < 70 THEN 1 ELSE 0 END AS TotalAssigned
        ,CASE WHEN  oi.QueueID > 0 and oi.lastmilestoneid < 70 THEN dbo.GetAdjustedVendorFee(oi.OrderID, oi.OrderItemID) END AS AssignedFees
        ,CASE WHEN oim.MilestoneID = 70 THEN 1 ELSE 0 END AS TotalSubmitted
        ,CASE WHEN oim.MilestoneID = 70 THEN dbo.GetAdjustedVendorFee(oi.OrderID, oi.OrderItemID) END AS SubmittedFees

    FROM
    OrderItems oi
    LEFT JOIN OrderItemMilestones oim ON oim.OrderID = oi.OrderID and oim.OrderItemID = oi.OrderItemID
    LEFT JOIN Vendors v ON v.VendorID = oi.VendorID
    WHERE
    oim.MilestoneDate BETWEEN dbo.TruncateDate(dateadd(dd, -1, Current_Timestamp)) and dbo.TruncateDate(Current_Timestamp)
    and oi.VendorID in (105144) 
    and oi.productid not in (105)
)x

GROUP BY Vendor)
SELECT * FROM CTE
UNION ALL SELECT NULL, 0,0,0,0  WHERE NOT EXISTS(SELECT * FROM CTE)
Run Code Online (Sandbox Code Playgroud)

这是一个不太复杂的演示的演示