复杂SQL子查询

复杂SQL子查询,sql,Sql,我有两张桌子: orders customers 我需要获得“VIP客户”-即自注册后每月至少订购一次的客户(在客户上有一列[subscription\u date]) 我想不出来:( 有什么想法吗?此查询统计每个客户在中订购的月数,并将其与客户订阅的月数进行比较。 两者价值相等的客户是您的VIP客户 SELECT T1.CUSTOMERID AS VIP_CUSTOMERS FROM (SELECT Count(*) AS NUM_MONTHS, CUS

我有两张桌子:

orders
customers
我需要获得“VIP客户”-即自注册后每月至少订购一次的客户(在
客户
上有一列
[subscription\u date]

我想不出来:(
有什么想法吗?

此查询统计每个客户在中订购的月数,并将其与客户订阅的月数进行比较。
两者价值相等的客户是您的VIP客户

SELECT T1.CUSTOMERID AS VIP_CUSTOMERS 
FROM   (SELECT Count(*) AS NUM_MONTHS, 
               CUSTOMERID 
        FROM   (SELECT DISTINCT Month(ORDERDATE), 
                                Year(ORDERDATE), 
                                CUSTOMERID 
                FROM   ORDERS 
                GROUP  BY CUSTOMERID)T 
        GROUP  BY CUSTOMERID)T1 
       INNER JOIN (SELECT CUSTOMERID, 
                          Datediff(MONTHS, SUBSCRIPTION_DATE, Getdate()) AS 
                          NUM_MONTHS 
                   FROM   CUSTOMERS)T2 
               ON T1.CUSTOMERID = T2.CUSTOMERID 
                  AND T1.NUM_MONTHS = T2.NUM_MONTHS 

如果您在上设置了一些示例数据,我将尝试根据数据重新编写查询。

选择COUNT(Orders.OrderID),Customers.CustomerID FROM Customers internal JOIN Orders on Orders.CustomerID=Customers.CustomerID GROUP BY Customers.CustomerID have COUNT(Orders.OrderID)>0
订单的结构“一个月一次"表示每个日历月一次或不超过一个月?即,如果他们在1月1日和2月28日下单,他们仍然是VIP吗?请提供表名和相关列,以及一些示例数据。此外,如果您知道您使用的SQL品牌,也会有所帮助,因为它们都不同。最后,尝试一下是个好主意首先是你自己,然后发布你尝试的代码。请尝试想出一个更好的标题。“复杂”-你怎么知道?你不知道答案可能是什么。“SQL”-已经有用于指示技术/语言的标记。“子查询”-可能是也可能不是答案中最重要的方面。另外,请添加您正在使用的特定数据库(例如MS SQL Server、MySQL、Oracle等)为了进一步澄清,除了Martin提出的问题,在一个月内订购两次是否弥补了在一个月内没有订购的不足。换句话说,如果有人已经是六个月的客户,并且订购了30次,但在上个月内没有订购,他们仍然被视为VIP吗?