2011-06-30 36 views
1

我有一个SP和UDF带给我总计。但我知道有一个COUNT CASE WHEN查询可能在一次去总计。任何人都可以在这方面帮助我吗?我目前的查询只是一个冗余暂停。一个更快的SQL查询来完成这项工作

ALTER PROCEDURE [dbo].[GetMailBasketsForLocums] 
AS 
BEGIN 
    SET NOCOUNT ON; 
    SET FMTONLY OFF; 
    SET DATEFORMAT DMY; 

SELECT DISTINCT Locum.OID, 
            Locum.FirstName + ' ' + Locum.LastName AS Name, 
            dbo.GetMailBasketTotalsForLocums(MailBasket.LocumId, 1) AS BookingsConfirmed, 
            dbo.GetMailBasketTotalsForLocums(MailBasket.LocumId, 3) AS BookingsCancelled, 
            dbo.GetMailBasketTotalsForLocums(MailBasket.LocumId, 5) AS BookingsSwitched, 
            (dbo.GetMailBasketTotalsForLocums(MailBasket.LocumId, 1) + 
            dbo.GetMailBasketTotalsForLocums(MailBasket.LocumId, 3) + 
            dbo.GetMailBasketTotalsForLocums(MailBasket.LocumId, 5)) AS Total 
    FROM MailBasket INNER JOIN 
       Locum 
       ON Locum.OID = MailBasket.LocumID 
    WHERE MailBasket.IsSent = 0 
       AND MailBasket.MailTypeID IN (1, 3, 5); 
END 

而且

ALTER FUNCTION [dbo].[GetMailBasketTotalsForLocums] 
(
    @LocumID BIGINT, 
    @MailTypeID INT 
) 
RETURNS int 
AS 
BEGIN 
    DECLARE @Result int 

    SELECT @Result = COUNT(MailBasket.OID) 
    FROM MailBasket 
    WHERE MailBasket.MailTypeID = @MailTypeID 
       AND MailBasket.LocumID = @LocumID 
       AND MailBasket.IsSent = 0; 

    RETURN @Result 

END 

问候。

回答

2
SELECT 
    DISTINCT Locum.OID, 
    Locum.FirstName + ' ' + Locum.LastName AS Name, 
    COUNT(CASE WHEN MailBasket.MailTypeID = 1 THEN 1 ELSE NULL END) AS BookingsConfirmed, 
    COUNT(CASE WHEN MailBasket.MailTypeID = 3 THEN 1 ELSE NULL END) AS BookingsCancelled, 
    COUNT(CASE WHEN MailBasket.MailTypeID = 5 THEN 1 ELSE NULL END) AS BookingsSwitched, 
    COUNT(*) AS Total 
FROM 
    MailBasket INNER JOIN 
      Locum 
      ON Locum.OID = MailBasket.LocumID 
WHERE MailBasket.IsSent = 0 
      AND MailBasket.MailTypeID IN (1, 3, 5); 

COUNT忽略NULL值的条件计数作品

您还可以使用SUM

SUM(CASE WHEN MailBasket.MailTypeID = 5 THEN 1 ELSE 0 END) 
1

试试这个:

SELECT DISTINCT Locum.OID, Locum.FirstName + ' ' + Locum.LastName AS Name, 
     COUNT(CASE WHEN MailBasket.MailTypeID = 1 THEN MailBasket.MailTypeID END) as BookingsConfirmed, 
     COUNT(CASE WHEN MailBasket.MailTypeID = 3 THEN MailBasket.MailTypeID END) as BookingsCancelled, 
     COUNT(CASE WHEN MailBasket.MailTypeID = 5 THEN MailBasket.MailTypeID END) as BookingsSwitched, 
     COUNT(*) as TOTAL 
FROM MailBasket INNER JOIN 
      Locum 
      ON Locum.OID = MailBasket.LocumID 
WHERE MailBasket.IsSent = 0 
      AND MailBasket.MailTypeID IN (1, 3, 5); 
1

您可以使用case一个sum内, Locum唱片公司:

select 
    Locum.OID, 
    Locum.FirstName + ' ' + Locum.LastName AS Name, 
    sum(case when MailBasket.MailTypeID = 1 then 1 else 0 end) as BookingsConfirmed, 
    sum(case when MailBasket.MailTypeID = 3 then 1 else 0 end) as BookingsCancelled, 
    sum(case when MailBasket.MailTypeId = 5 then 1 else 0 end) as BookingsSwitched, 
    count(*) as Total 
from 
    MailBasket 
    inner join Locum on Locum.OID = MailBasket.LocumID 
where 
    MailBasket.IsSent = 0 
    and MailBasket.MailTypeID IN (1, 3, 5) 
group by 
    Locum.OID, Locum.FirstName, Locum.LastName