2016-12-02 28 views
0

我想爲2015年第一個訂單的客戶選擇所有記錄。我想要他們在2015年之後發出的任何訂單,但是我不想爲第一個訂單我最終試圖找到訂購超過兩次的人的百分比,但我想排除2016年新的客戶。在2015年選擇客戶的所有記錄

這不起作用,因爲'mindate'是無效列名稱,但我不知道爲什麼或如何嘗試它。

Select 
    od.CustomerID, OrderID, OrderDSC, OrderDTS 
From 
    OrderDetail OD 
Join 
    (Select 
     OrderID, Min(orderdts) as mindate 
    From 
     OrderDetail 
    Where 
     mindate Between '2015-1-1' and '2015-12-31' 
    Group By Orderid) b on od.OrderID = b.OrderID 

回答

0

因爲execution phases - 它是seqency qry如何評估和引擎。在哪裏你的思想還沒有存在。

您可以通過orderdts改變MINDATE:

select OrderID, min(orderdts) as mindate 
from OrderDetail 
where orderdts between '2015-1-1' and '2015-12-31' 
group by Orderid 

第二個選擇是使用having聲明 - group by後,它的評估。

0

我所選擇的是不同的CustomerID,它們落在你的日期範圍之間,並且與表格進行了左連接,因此它過濾掉了不在你的日期範圍之間的任何人。

SELECT * FROM 
    (Select DISTINCT(CustomerID) as CustomerID 
     FROM OrderDetail WHERE OrderDTS between '2015-1-1' AND '2015-12-31') oIDs 

LEFT JOIN 

    OrderDetail OD 

ON oIDs.CustomerID = OD.CustomerID 
0

嘗試使用EXISTS子句。它基本上是一個子查詢。以下是您應該能夠適應的一個示例。

create table Test (Id int, aDate datetime) 

insert Test values (1,'04/04/2014') 
insert Test values (1,'05/05/2015') 
insert Test values (1,'06/06/2016') 
insert Test values (2,'04/30/2016') 
insert Test values (3,'02/27/2014') 


select t.* from Test t 
where 
    aDate>='01/01/2015' 
    and exists(select * from Test x where x.Id=t.Id and x.aDate >='01/01/2015' and x.aDate<'01/01/2016') 
0

我不知道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;