2016-12-14 23 views
1

SQL Server:這是我的基本查詢。我無法弄清楚如何正確地讓這個「結果」每個商店/日期只顯示一行,這兩個查詢分別填入第3列和第4列。現在結果是每個商店/日期給我2行,其中NULL對立的列。它應該只是每個商店/日期一行,偶爾還有一個空的剩餘第三列。減少來自兩個UNION查詢的輸出,結果太多的當前行數太多

DECLARE @START DATETIME, @END DATETIME 
SET @END = CAST(CAST(GETDATE() AS DATE) AS DATETIME) + '03:00' 
SET @START = @END - 7 

SELECT 
    @START [From], @END [To] 

SELECT 
    DivisionName, DateClosed, COUNT(OrderId) AS PREDATED, NULL AS DAYOF 
FROM 
    (SELECT 
     o.OrderId, DivisionName, DateCreated, 
     CONVERT(Date, DateClosed) [DateClosed] 
    FROM 
     POS.Orders o WITH(NOLOCK) 
    JOIN 
     POS.OrderDetails od WITH(NOLOCK) ON o.OrderId = od.OrderId 
    JOIN 
     Directory.Divisions d WITH(NOLOCK) ON o.DivisionId = d.DivisionId 
    WHERE 
     DateClosed BETWEEN @START AND @END AND DateCreated < @START) t 
GROUP BY 
    DivisionName, DateClosed 

UNION 

SELECT 
    DivisionName, DateClosed, NULL AS PREDATED, COUNT(OrderID) AS DAYOF 
FROM 
    (SELECT 
      o.OrderId, DivisionName, DateCreated, 
      CONVERT(Date,DateClosed)[DateClosed] 
     FROM 
      POS.Orders o WITH(NOLOCK) 
     JOIN 
      POS.OrderDetails od WITH(NOLOCK) ON o.OrderId = od.OrderId 
     JOIN 
      Directory.Divisions d WITH(NOLOCK) ON o.DivisionId = d.DivisionId 
     WHERE 
      DateClosed BETWEEN @START AND @END AND DateCreated >= @START) s 
GROUP BY 
    DivisionName, DateClosed 

SQL results

+0

只要使用'; WITH t as(選擇DivisionName,DateClosed,MAX(PREDATED)作爲PREDATED,MAX(DAYOF)作爲D GROUP BY DivisionName,DateClosed;';)的日期。 –

+0

只需在整個日期範圍內選擇數據集_once_,然後在'COUNT'中使用case語句來選擇要計算的日期範圍,就可以簡化查詢。當你重複這樣的代碼時,通常有更好的方法來做到這一點。我會發布更多的細節,如果你有興趣 –

+0

shA.t - ;與T建議上面工作完美。現在我需要閱讀並理解爲什麼我會在未來有把握地複製這種技術。如果您將此添加爲答案,我會向上投票。 –

回答

2

可以使用的結構是這樣的:

;WITH t as (
    <your query> 
) 
SELECT DivisionName, DateClosed, MAX(PREDATED) AS PREDATED, MAX(DAYOF) AS DAYOF 
FROM t 
GROUP BY DivisionName, DateClosed; 

我沒有你的樣本數據,但是你可以使用這樣的查詢:

SELECT 
    DivisionName, CONVERT(Date, DateClosed) [DateClosed], 
    COUNT(CASE WHEN DateClosed BETWEEN @START AND @END AND DateCreated < @START THEN 0 END) AS PREDATED, 
    COUNT(CASE WHEN DateClosed BETWEEN @START AND @END AND DateCreated >= @START THEN 0 END) AS DAYOF 
FROM 
    POS.Orders o WITH(NOLOCK) 
JOIN 
    POS.OrderDetails od WITH(NOLOCK) ON o.OrderId = od.OrderId 
JOIN 
    Directory.Divisions d WITH(NOLOCK) ON o.DivisionId = d.DivisionId 
GROUP BY 
    DivisionName, DateClosed 
+0

這看起來非常有希望,但由於BETWEEN的東西沒有設法排除範圍之外的訂單,導致成千上萬的單個行。 –

+0

我試圖移動WHERE DateClosed BETWEEN ....進一步下降之前,工作,但這導致了12000行正確的單個結果,比我開始時更糟,試圖讓我的兩個原始SUM結果合併下來更。 –

+0

爲什麼你認爲第二種解決方案更糟?因爲第二個性能問題更好!也作爲可讀性問題! –