2012-03-08 79 views
1

好的這是一個很好的問題,我認爲。將零值添加到報告

目前,我有一份報告顯示每臺機器的票數量以及每臺機器在票務銷售中所賺取的金額。

有些機器出售零票,但他們不包括在我的報告。

現在我想包括他們。 有一個machconfig表中所有機器的完整列表,我可以將其與ticketssold表相比較,它也有一個與銷售機器相對應的字段。

所以我想我可以找到所有還沒有通過查找機器的ID(MCHterminalid),其不出現在ticketssold表(TKtermid列)

這裏賣的票的機器是我已經得到了代碼到目前爲止..

SELECT TKtermID, 
    MCHlocation, 
    Count (TKvouchernum) AS Totaltickets, 
    Cast(Sum(TKcomission) AS FLOAT)/100 AS Total_Comission 
FROM ticketssold(NOLOCK) 
    INNER JOIN machconfig (NOLOCK) 
    ON MCHterminalID = TKtermID 
WHERE cfglocationcountry = 'UK' 
    AND dateadded BETWEEN Getdate() - 100 AND Getdate() 
GROUP BY vstermID, 
     cfglocation 
ORDER BY Total_comission DESC 
+0

此查詢是否運行?我以爲你必須使用adddate函數來做你想做的日期計算...另外,不要迂腐,但你的問題不會問一個問題... – Rikon 2012-03-08 16:16:32

+0

@Rikon好點 - 我的答案是應用我的建議的問題的複製和粘貼 - 我會根據您的建議修改我的答案以防萬一。 – Bridge 2012-03-08 16:23:56

回答

1

OCD版本沒有完全證明(也殺了我,表名不包括在字段之前)。使用外部聯接結合COALESCE

SELECT 
    TKTermID TicketTerminalId, 
    MchLocation MachineLocation, 
    COALESCE(COUNT(TKVoucherNum),0) TotalTickets, 
    COALESCE(CAST(SUM(TKComission) AS float),0)/100 TotalComission 
FROM 
    MachConfig (NOLOCK) 
    LEFT JOIN 
    TicketsSold (NOLOCK) 
    ON 
     TKtermID = MCHterminalID 
WHERE 
    CfgLocationCountry = 'UK' 
    AND 
    DateAdded BETWEEN DATEADD(DAY, -100, GETDATE()) AND GETDATE() 
GROUP BY 
    VSTermID, 
    CfgLocation 
ORDER BY 
    COALESCE(CAST(SUM(TKComission) AS float),0)/100 DESC; --Do this in reporting! 
+0

我認爲'COALESCE(COUNT TKVoucherNum),0)TotalTickets'沒有意義,因爲Count永遠不會返回null - COUNT(TKVoucherNum)TotalTickets'應該這樣做。 – Bridge 2012-03-08 16:48:30

3

變化ticketssold和machconfig之間的內部連接到右外連接來獲取所有的機器,無論在賣表的門票匹配。 TKVouchernum的計數將爲您返回零:

SELECT TKtermID, 
    MCHlocation, 
    Count (TKvouchernum) AS Totaltickets, 
    Cast(Sum(TKcomission) AS FLOAT)/100 AS Total_Comission 
FROM ticketssold(NOLOCK) 
    RIGHT OUTER JOIN machconfig (NOLOCK) 
    ON MCHterminalID = TKtermID 
WHERE cfglocationcountry = 'UK' 
    AND dateadded BETWEEN DateAdd(DAY, -100, GetDate()) AND Getdate() 
GROUP BY vstermID, 
     cfglocation 
ORDER BY Total_comission DESC 
+0

嗨。它不會返回machconfig中的所有機器。出於某種原因,左/右外連接不會增加顯示的機器數量。即它沒有顯示出售的總票數爲零的機器。在我的DB中有2500臺'英國'註冊機器,其中1400臺已售出機票,但此查詢僅顯示1400而不顯示其他機器 – Axle 2012-03-09 11:02:20

+0

@RoRy - 您的'WHERE'子句中的列來自哪裏? (如果你使用了別名,那麼我們可以知道它會有所幫助)。如果它們來自'ticketssold',則將這些條件移動到'RIGHT JOIN'的'ON'子句中(否則,它們強制該連接恢復爲'INNER JOIN'。 – 2012-03-09 15:18:38

0

不要使用內部連接,因爲它們會消除行。我開始與包含所有數據的表進行連接。在這種情況下,machconfig然後對有問題的數據ticketssold進行左外連接。

您可能還想考慮在報表方面進行靈活分組。

0

終於得到它的工作就是我想要的。這裏是正確的代碼:

SELECT MCHTerminalID, MCHLocation, ISNULL(CONVERT(varchar(16), batch.LastBatchIn, 103),     

'Did not batch in') AS LastBatchIn, 
ISNULL(COUNT(Ticket.VoucherNum), 0) AS TotalVouchers, 
    ISNULL(SUM(Ticket.Sale), 0) AS TotalGrossAmount, ISNULL(SUM(Ticket.Refund),0) AS   TotalRefundAmount, ISNULL(SUM(Ticket.Comission),0) AS TotalComission 
FROM termConfig AS config WITH (NOLOCK) 
LEFT OUTER JOIN 

(SELECT bsTerminalID, MAX(bsDateTime) AS LastBatchIn 
FROM batchSummary WITH (NOLOCK) 
    WHERE bsDateTime BETWEEN getdate()-50 AND getdate() 
GROUP BY bsTerminalID 
) 
AS batch 

    ON config.MCHTerminalID = batch.bsTerminalID 
LEFT OUTER JOIN 

    (SELECT DISTINCT TKTermID, 
    TKVoucherNum AS VoucherNum, 
    CAST(TKGrossTotal AS float)/100 AS Sale, 
    CAST(TKRefundAmount AS float)/100 AS Refund, 
    CAST(TKComission AS float)/100 AS Comission 
    FROM TicketVouchers WITH (NOLOCK) 
    WHERE dateAdded BETWEEN getdate()-50 AND getdate() 
    ) 
    AS Ticket 
    ON 
     config.MCHTerminalID = Ticket.TKTermID 




    WHERE 
     config.MCHLocationCountry = 'uk' 
    AND config.MCHProductionTerminal = 'Y' 
    GROUP BY config.MCHTerminalID, config.MCHLocation, LastBatchIn 
    ORDER BY TotalComission desc 
0

你可以UNION的「零」行到原來的例如

<original query here> 
... 
UNION 
SELECT MCHterminalID, 
     MCHlocation, 
     0 AS Totaltickets, 
     0 AS Total_Comission 
    FROM machconfig 
WHERE NOT EXISTS (
        SELECT * 
        FROM ticketssold 
        WHERE MCHterminalID = TKtermID 
       ) 

(對提示的評論)。