2017-06-22 47 views
0

我在使用SQL查询时遇到了一些困难。有一个表名有以下的列两个客户订单之间的时间间隔

Order_ID INT -Primary Key 
Customer_ID INT - Customer who made the transaction 
Order_Time_Stamp DATE - Date and time of transaction 
Item STRING - Description of item purchased 
Transaction_Status STRING - Status can be "Success" and "Failure" 

Customer_Orders我们怎样才能获得一阶和在30天内每一位客户二阶只针对客户,其首要任务就是成功与天时间?

我查询的逻辑是这样的:

select Customer_ID, Duration_Between_Order_In_Days 
from Customer_Orders 
where DATEDIFF(DAYS, First_Order_Date, Second_Order_Date) < 30 
and First_Order_Status='Success' 

我一直在使用DATEDIFF尝试()函数和自联接和子查询,但我不知道如何为每个客户找到二阶。任何想法,将不胜感激!

+0

要清楚你不在乎第二顺序是成功还是失败? –

+2

Mysql或sql-server - 解决方案每个都会有所不同? –

+0

1. SQL Server所需的解决方案2.第二顺序是成功还是失败并不重要。 3. First_Order_Date和Second_Order_Date不是直接字段,如何得到它们是问题。 – SqlMind

回答

0

使用adventureworks2012 [销售]。[的SalesOrderHeader]其中第10条是这样的(复位第一的SalesOrderID的状态为客户11000至0后),其中5等同于成功

+--------------+---------------------+------------+--------+ 
| salesorderid | orderdate   | customerid | status | 
+--------------+---------------------+------------+--------+ 
|   1 | 2009-10-13 00:00:00 |   0 |  0 | 
|  43793 | 2005-07-22 00:00:00 |  11000 |  0 | 
|  51522 | 2007-07-22 00:00:00 |  11000 |  5 | 
|  57418 | 2007-11-04 00:00:00 |  11000 |  5 | 
|  43767 | 2005-07-18 00:00:00 |  11001 |  5 | 
|  51493 | 2007-07-20 00:00:00 |  11001 |  5 | 
|  72773 | 2008-06-12 00:00:00 |  11001 |  5 | 
|  43736 | 2005-07-10 00:00:00 |  11002 |  5 | 
|  51238 | 2007-07-04 00:00:00 |  11002 |  5 | 
|  53237 | 2007-08-27 00:00:00 |  11002 |  5 | 
+--------------+---------------------+------------+--------+ 
10 rows in set (0.18 sec) 

的Mysql

select f.customerid,f.firstorder,o2.`Status`,s.secondorder,o3.`status`, 
     o2.OrderDate, o3.OrderDate, datediff(o3.OrderDate, o2.OrderDate) daysbetweenorders 
from 
(
select customerid,min(salesorderid) firstorder 
from orders 
where #customerid = 11000 and 
     status = 5 
group by customerid 
) f 
join 
(
select customerid,min(o.salesorderid) secondorder 
from orders o 
where #o.customerid = 11000 and 
     o.salesorderid > (select min(salesorderid) from orders o1 where o1.customerid = o.customerid and o1.Status = 5) 
group by customerid 
) s on s.customerid = f.customerid 
join orders o2 on o2.SalesOrderID = f.firstorder 
join orders o3 on o3.SalesOrderID = s.secondorder 

limit 10 

结果

+------------+------------+--------+-------------+--------+---------------------+---------------------+-------------------+ 
| customerid | firstorder | Status | secondorder | status | OrderDate   | OrderDate   | daysbetweenorders | 
+------------+------------+--------+-------------+--------+---------------------+---------------------+-------------------+ 
|  11000 |  51522 |  5 |  57418 |  5 | 2007-07-22 00:00:00 | 2007-11-04 00:00:00 |    105 | 
|  11001 |  43767 |  5 |  51493 |  5 | 2005-07-18 00:00:00 | 2007-07-20 00:00:00 |    732 | 
|  11002 |  43736 |  5 |  51238 |  5 | 2005-07-10 00:00:00 | 2007-07-04 00:00:00 |    724 | 
|  11003 |  43701 |  5 |  51315 |  5 | 2005-07-01 00:00:00 | 2007-07-09 00:00:00 |    738 | 
|  11004 |  43810 |  5 |  51595 |  5 | 2005-07-26 00:00:00 | 2007-07-26 00:00:00 |    730 | 
|  11005 |  43704 |  5 |  51612 |  5 | 2005-07-02 00:00:00 | 2007-07-27 00:00:00 |    755 | 
|  11006 |  43819 |  5 |  51198 |  5 | 2005-07-27 00:00:00 | 2007-07-02 00:00:00 |    705 | 
|  11007 |  43743 |  5 |  51581 |  5 | 2005-07-12 00:00:00 | 2007-07-25 00:00:00 |    743 | 
|  11008 |  43826 |  5 |  51282 |  5 | 2005-07-28 00:00:00 | 2007-07-07 00:00:00 |    709 | 
|  11009 |  43837 |  5 |  51562 |  5 | 2005-07-30 00:00:00 | 2007-07-24 00:00:00 |    724 | 
+------------+------------+--------+-------------+--------+---------------------+---------------------+-------------------+ 
10 rows in set (0.77 sec) 

的SQL Server 只非常相似,但状态需要逃避,DATEDIFF语法是不同的,最高限额替换

select top 10 f.customerid,f.firstorder,o2.[Status],s.secondorder,o3.[status], 
     o2.OrderDate, o3.OrderDate, datediff(d,o2.OrderDate, o3.OrderDate) daysbetweenorders 
from 
(
select customerid,min(salesorderid) firstorder 
from [Sales].[SalesOrderHeader] 
where --customerid = 11000 and 
     status = 5 
group by customerid 
) f 
join 
(
select customerid,min(o.salesorderid) secondorder 
from [Sales].[SalesOrderHeader] o 
where --o.customerid = 11000 and 
     o.salesorderid > (select min(salesorderid) from [Sales].[SalesOrderHeader] o1 where o1.customerid = o.customerid and o1.Status = 5) 
group by customerid 
) s on s.customerid = f.customerid 
join [Sales].[SalesOrderHeader] o2 on o2.SalesOrderID = f.firstorder 
join [Sales].[SalesOrderHeader] o3 on o3.SalesOrderID = s.secondorder 
order by f.customerid 

注: - 确保你有适当的钥匙 - 我看到下面的MySQL(不能保证这些对您的应用程序)。

CREATE TABLE `orders` (
    `SalesOrderID` int(11) NOT NULL, 
    `RevisionNumber` int(11) NOT NULL, 
    `OrderDate` varchar(50) NOT NULL, 
    `DueDate` varchar(50) NOT NULL, 
    `ShipDate` varchar(50) DEFAULT NULL, 
    `Status` int(11) NOT NULL, 
    `OnlineOrderFlag` int(11) NOT NULL, 
    `SalesOrderNumber` int(11) DEFAULT NULL, 
    `PurchaseOrderNumber` int(11) DEFAULT NULL, 
    `AccountNumber` int(11) DEFAULT NULL, 
    `CustomerID` int(11) NOT NULL, 
    `SalesPersonID` int(11) DEFAULT NULL, 
    `TerritoryID` int(11) DEFAULT NULL, 
    `BillToAddressID` int(11) NOT NULL, 
    `ShipToAddressID` int(11) NOT NULL, 
    `ShipMethodID` int(11) NOT NULL, 
    `CreditCardID` int(11) DEFAULT NULL, 
    `CreditCardApprovalCode` varchar(15) DEFAULT NULL, 
    `CurrencyRateID` int(11) DEFAULT NULL, 
    `SubTotal` decimal(10,2) NOT NULL, 
    `TaxAmt` decimal(10,2) NOT NULL, 
    `Freight` decimal(10,2) NOT NULL, 
    `TotalDue` decimal(10,2) DEFAULT NULL, 
    `Comment` varchar(128) DEFAULT NULL, 
    `rowguid` varchar(50) DEFAULT NULL, 
    `ModifiedDate` varchar(50) NOT NULL, 
    KEY `k001` (`OrderDate`,`SalesOrderID`), 
    KEY `k1` (`CustomerID`,`SalesOrderID`), 
    KEY `k2` (`SalesOrderID`) 
) ENGINE=InnoDB DEFAULT CHARSET=latin1 
0
select Customer_ID, Duration_Between_Order_In_Days 

    from Customer_Orders 

    where DATEDIFF(First_Order_Date, Second_Order_Date) < 30 

and First_Order_Status='Success' 

如上面的查询所示,试试这个。

只要注意您的First_Order_Date, Second_Order_Date必须采用'YYYY-MM-DD'的形式。

希望这会帮助你。

+0

我不认为他知道如何获得SecondOrderdate首先。 –

+0

感谢萨加尔但First_Order_Date和Second_Order_Date不是直接领域,如何让他们的问题。 – SqlMind