添加零值以进行报告

时间:2012-03-08 16:10:13

标签: sql sql-server-2005 tsql reporting-services

好的我认为这是一个很好的问题。

目前,我有一份报告显示每台机器的门票数量以及每台机器在门票销售中的数量。

有些机器出售零票,但我们的报告中没有这些机票。

现在我想要加入它们。 有一个完整的machconfig表中所有机器的列表,我可以将它与ticketssold表进行比较,该表还有一个与销售它的机器相对应的字段。

所以我想我可以通过寻找机票ID(MCHterminalid)找不到售票的所有机器,这些机器ID不会出现在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 

5 个答案:

答案 0 :(得分: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 

答案 1 :(得分: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!

答案 2 :(得分:0)

不要使用内部联接,因为它们会消除行。我开始加入包含所有数据的表。在这种情况下,使用machconfig,然后使用有问题的数据ticketsold对表进行左外连接。

您可能还想考虑在报告方面进行分组以获得灵活性。

答案 3 :(得分: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

答案 4 :(得分: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
                  )

(回顾提示)。