Я не знаю, тип orderdts данных, но если это DateTime заказы на 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 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;