2017-09-25 10 views
-1

私は別の列に、例えば、私の「PrinterCounter.EndPagesColor」と「PrinterCounter.EndPagesMono」の句は、私がこの場所を使用したいのWHERE異なる指定する必要があります。SQL Serverの - 別の列に別の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は" 私はこの1つをしたいために:

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 

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 

ここでは完全なコードです

私はそれを明確にしています。すべてのプリンタには、1日の始めにカウンタがあり、1日の終わりに1つのカウンタがあります。生産は、終了からマイナスになります。

各クライアントには複数のプリンタがあり、指定された期間内に1台のプリンタごとにプロダクションを収集する必要があります。

この結合は、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 

が、私はそれは悪い習慣であるかなり確信していると私は「けれども、それは[OK]を

+2

これらの2つのWHERE句は同じではありませんか? – sagi

+0

私が見るのは唯一の相違は 'ORDER BY'の方向です – Siyual

+1

2つのクエリを行い、' Union'を使用できますか? – Nope

答えて

0

を改善することができる私は、私はあなたを理解だと思います私はそれがいつまでもわからない。

PrinterCounter.StartPagesMonoは、あなたが、あなたはCASE EXPRESSION条件付き集約を使用することができ、それはこのようなものになりますようにしたい新しい列あり、printerCounter.StartPagesColorPrinterCounter.EndPagesMonoPrinterCounter.EndPagesColorの場合:私はあなたにもする必要があると思うけど

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列を削除します。