Добавление нулевых значений в отчет - PullRequest
1 голос
/ 08 марта 2012

Хорошо. Думаю, это хороший вопрос.

На данный момент у меня есть отчет, показывающий количество билетов на машину и сколько каждая машина заработала в продаже билетов.

Некоторые машины продают билеты Zero, но они не включены в мой отчет.

Теперь я хочу включить их. в таблице machconfig есть полный список всех машин, которые можно сравнить с таблицей проданных билетов, в которой также есть поле, соответствующее машине, которая ее продала.

Так что, я думаю, я мог бы найти все машины, которые не продали билеты, по поиску идентификаторов машин (MCHterminalid), которые не отображаются в таблице билетов (столбец 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 ]

3 голосов
/ 08 марта 2012

Измените внутреннее объединение между проданными билетами и 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 голос
/ 08 марта 2012

Версия 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 голосов
/ 09 марта 2012

Вы можете 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
                  )

(обзор подсказок).

0 голосов
/ 09 марта 2012

Наконец-то все заработало так, как я хочу .. Вот правильный код:

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 голосов
/ 08 марта 2012

Не используйте внутренние объединения, потому что они будут удалять строки.Я начинаю свои объединения с таблицы, в которой есть все данные.В этом случае machconfig, а затем выполните левое внешнее соединение с таблицей с проблемными данными о продаже билетов.

Вы также можете подумать о том, чтобы сделать группировку на стороне отчета более гибкой.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...