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
只要使用'; WITH t as(選擇DivisionName,DateClosed,MAX(PREDATED)作爲PREDATED,MAX(DAYOF)作爲D GROUP BY DivisionName,DateClosed;';)的日期。 –
只需在整個日期範圍內選擇數據集_once_,然後在'COUNT'中使用case語句來選擇要計算的日期範圍,就可以簡化查詢。當你重複這樣的代碼時,通常有更好的方法來做到這一點。我會發布更多的細節,如果你有興趣 –
shA.t - ;與T建議上面工作完美。現在我需要閱讀並理解爲什麼我會在未來有把握地複製這種技術。如果您將此添加爲答案,我會向上投票。 –