2017-09-25 110 views
-1

我需要指定不同的,其中的条款,以不同的列,例如,我的“PrinterCounter.EndPagesColor”和“PrinterCounter.EndPagesMono”我想用这个地方:SQL服务器 - 不同的WHERE的条款,以不同的列

WHERE 
    PrinterCounter.ReadTime >= '01/07/2017 00:00:01' 
    AND PrinterCounter.ReadTime <= '31/07/2017 23:59:59' 
    AND Printer.WasRemoved = 0 
    AND ClientId = 6 
    AND SubClientId = 752 
ORDER BY 
    PrinterCounter.ReadTime DESC 

但对于 “PrinterCounter.StartPagesColor” 和 “PrinterCounter.StartPagesMono” 我想这一个:

WHERE 
    PrinterCounter.ReadTime >= '01/07/2017 00:00:01' AND 
    PrinterCounter.ReadTime <= '31/07/2017 23:59:59' AND 
    Printer.WasRemoved = 0 AND 
    ClientId = 6 AND 
    SubClientId = 752 
ORDER BY 
    PrinterCounter.ReadTime ASC 

下面是完整的代码:

SELECT DISTINCT 
    Printer.[PrinterId], 
    Printer.[PlaceId], 
    PrinterCounter.ReadTime, 
    PrinterCounter.EndPagesColor, 
    PrinterCounter.EndPagesMono, 
    PrinterCounter.StartPagesColor, 
    PrinterCounter.StartPagesMono 
FROM  
    [~client_database~].[dbo].[Printers] AS Printer 
JOIN 
    [~system_database~].[dbo].[PrinterCounter] AS PrinterCounter ON PrinterCounter.PrinterId = Printer.PrinterId 
WHERE 
    PrinterCounter.ReadTime >= '01/07/2017 00:00:01' 
    AND PrinterCounter.ReadTime <= '31/07/2017 23:59:59' 
    AND Printer.WasRemoved = 0 
    AND ClientId = 6 
    AND SubClientId = 752 
ORDER BY 
    PrinterCounter.ReadTime ASC 

我会为你弄清楚,每台打印机在一天开始时有一个计数器,一天在结束时,产量将减去开始。

每个客户有几台打印机,我必须在提供的时间内收集每台打印机的产量。

该连接是为了确保SQL仅返回带有计数器的打印机。


这是一个想:

SELECT 
DISTINCT 
    Printer.PrinterId 
    ,Printer.PlaceId 
    ,PrinterCounter.ReadTime 
    ,(
     SELECT TOP 1 
      EndPagesMono 
     FROM 
      [system_mfpm].[dbo].[PrinterCounter] 
     WHERE 
      PrinterCounter.ReadTime >= '01/07/2017 00:00:01' AND PrinterCounter.ReadTime <= '31/07/2017 23:59:59' 
      AND PrinterCounter.ClientId = 6 
      AND PrinterCounter.SubClientId = 752 
      AND PrinterCounter.PrinterId = Printer.PrinterId 
     ORDER BY PrinterCounter.ReadTime DESC 
    )-(
     SELECT TOP 1 
      StartPagesMono 
     FROM 
      [system_mfpm].[dbo].[PrinterCounter] 
     WHERE 
      PrinterCounter.ReadTime >= '01/07/2017 00:00:01' AND PrinterCounter.ReadTime <= '31/07/2017 23:59:59' 
      AND PrinterCounter.ClientId = 6 
      AND PrinterCounter.SubClientId = 752 
      AND PrinterCounter.PrinterId = Printer.PrinterId 
     ORDER BY PrinterCounter.ReadTime ASC 
    ) AS Mono 
    ,(
     SELECT TOP 1 
      EndPagesColor 
     FROM 
      [system_mfpm].[dbo].[PrinterCounter] 
     WHERE 
      PrinterCounter.ReadTime >= '01/07/2017 00:00:01' AND PrinterCounter.ReadTime <= '31/07/2017 23:59:59' 
      AND PrinterCounter.ClientId = 6 
      AND PrinterCounter.SubClientId = 752 
      AND PrinterCounter.PrinterId = Printer.PrinterId 
     ORDER BY PrinterCounter.ReadTime DESC 
    )-(
     SELECT TOP 1 
      StartPagesColor 
     FROM 
      [system_mfpm].[dbo].[PrinterCounter] 
     WHERE 
      PrinterCounter.ReadTime >= '01/07/2017 00:00:01' AND PrinterCounter.ReadTime <= '31/07/2017 23:59:59' 
      AND PrinterCounter.ClientId = 6 
      AND PrinterCounter.SubClientId = 752 
      AND PrinterCounter.PrinterId = Printer.PrinterId 
     ORDER BY PrinterCounter.ReadTime ASC 
    ) AS Color               
    FROM [client_lfn_MTUXNJCZMJQA].[dbo].[Printers] AS Printer 
    JOIN [system_mfpm].[dbo].[PrinterCounter] AS PrinterCounter ON PrinterCounter.PrinterId = Printer.PrinterId 
    WHERE Printer.WasRemoved = 0 

,但我敢肯定这是一个不好的做法,它可以提高

+2

是不是这两个'WHERE'子句相同? – sagi

+0

我看到的唯一区别是'ORDER BY'方向 – Siyual

+1

您可以做2个单独的查询并使用'Union'吗? – Nope

回答

0

好吧,我想我理解你,虽然我”我不知道这是怎么回事。

如果PrinterCounter.EndPagesColorPrinterCounter.EndPagesMonoprinterCounter.StartPagesColorPrinterCounter.StartPagesMono是你想,那么你可以使用条件的聚集与CASE EXPRESSION新列,它会是这个样子:

SELECT 
    Printer.[PrinterId], 
    Printer.[PlaceId], 
    PrinterCounter.ReadTime, 
    MAX(CASE WHEN <Your first conditions> THEN PrinterCounter.PagesColor END) as StartPagesColor, 
    MAX(CASE WHEN <Your first conditions> THEN PrinterCounter.PagesMono END) as StartMonoColor,  
    MAX(CASE WHEN <Your second conditions> THEN PrinterCounter.PagesColor END) as EndPagesColor, 
    MAX(CASE WHEN <Your second conditions> THEN PrinterCounter.PagesMono END) as EndMonoColor  
FROM ... // rest of query 
GROUP BY Printer.[PrinterId], 
     Printer.[PlaceId], 
     PrinterCounter.ReadTime 

虽然我觉得你还需要从选择列表中删除ReadTime列。