我不知道orderdts數據類型,但如果是在2015年12月31日的日期時間的訂單將不包括(除非訂單日期爲2015年12月31日00:00:00.000注意這將如何跳過第一個記錄:
DECLARE @orders TABLE (CustomerID INT, orderDate DATETIME);
INSERT @orders VALUES (1, '2015-12-31 00:00:01.000'), (1, '2015-12-30'), (2, '2015-01-04');
SELECT * FROM @orders WHERE orderDate BETWEEN '2015-01-01' AND '2015-12-31';
在這種情況下,你會想在WHERE子句過濾器看起來像:
WHERE orderDate BETWEEN '2015-01-01 00:00:00.000' AND '2015-12-31 23:59:59.999';
或者
WHERE CAST(orderDate AS date) BETWEEN '2015-01-01' AND '2015-12-31';
(第一個例子幾乎肯定會表現更好)。現在
,使用此示例數據:
-- Sample data
CREATE TABLE #LIST (LISTName varchar(10) NOT NULL);
INSERT #LIST
SELECT TOP (100) LEFT(newid(), 8)
FROM sys.all_columns a, sys.all_columns b;
-- You will probably want LISTName to be indexed
CREATE NONCLUSTERED INDEX nc_LISTName ON #LIST(LISTName);
您可以實現保羅的解決方案是這樣的:
DECLARE @LIST_Param varchar(8) = 'No List';
SELECT LISTName
FROM
(
SELECT distinct LISTName
FROM #LIST
UNION ALL
SELECT 'No List'
WHERE (SELECT COUNT(DISTINCT LISTName) FROM #LIST) < 1000000
) Distinct_LISTName
WHERE (@LIST_Param = 'No List' or @LIST_Param = LISTName);
或者你可以這樣做:
DECLARE @LIST_Param varchar(8) = 'No List';
WITH x AS
(
SELECT LISTName, c = COUNT(*)
FROM #LIST
WHERE (@LIST_Param = 'No List' or @LIST_Param = LISTName)
GROUP BY LISTName
),
c AS (SELECT s = SUM(c) FROM x)
SELECT LISTName
FROM x CROSS JOIN c
WHERE s < 1000000;