2

テーブルが1つあります。その中に、顧客、注文、および注文の日付があります。これがそれであるとしましょう:

Customer   Orders  Date
----       ----    ----
Smith        1     2012-02-18 11:22:29.000
John         1     2012-08-21 02:04:38.000
Jones        1     2013-01-02 03:23:12.000
Smith        1     2013-02-06 09:12:32.000

1年以上の間にどの顧客が返品して注文したか、そして何件の注文をしたかを知りたいです。それで、スミスは2012年と2013年に注文しましたか?はい。この2年間で何回ですか?2回。

結果は次のようになります。

Customer   Orders  
----       ---- 
Smith        2 

2年間に注文された回数を数える方法は知っていますが、1年だけで注文した人を除外する方法はわかりません。両方ではありません。

SELECT 
    o.Customer, 
    COUNT(o.Orders) as Orders
FROM Order as o
WHERE Date BETWEEN '2012-01-01' AND '2014-01-01'
GROUP BY o.Customer

私は最初に周りを見回しましたが、2つの異なるテーブルから引き出された答えしか見られず、迷子になりました。:(

4

3 に答える 3

1

HAVING句を使用します。

SELECT 
    o.Customer, 
    COUNT(o.Orders) as Orders
FROM Order as o
WHERE Date BETWEEN '2012-01-01' AND '2014-01-01'
GROUP BY o.Customer
HAVING COUNT(o.Orders) > 1

あなたが特に異なる年に注文を持っていることを探しているなら、ここにクエリがあります

SELECT 
        o.Customer,  
        COUNT(o.Orders) as Orders
    FROM Orders as o
    WHERE Date BETWEEN '01-Jan-2012' AND '01-Jan-2014'
    GROUP BY o.Customer
    HAVING COUNT(DISTINCT YEAR(Date)) > 1

これがSQLフィドルです

于 2013-02-07T21:33:20.050 に答える
0

これにより、異なる年の注文があることが確認されます。

SELECT 
    o.Customer, 
    COUNT(*) as Orders
FROM Order as o
WHERE Date BETWEEN '2012-01-01' AND '2014-01-01'
GROUP BY o.Customer
HAVING MIN(YEAR(o.Date)) <> MAX(YEAR(o.Date)) 

あなたの日付が本当に1年ではない場合。

SqlFiddleは、データが少し異なり、having句の違いを確認します。

ヒント:テーブル名としてOrderを使用しないでください:これは予約済みのキーワードであり、混乱の原因になります。

于 2013-02-07T21:36:28.287 に答える
0

これが私がすることです:

 WITH A AS (
  SELECT Customer
     ,   Orders
     ,   Date
     ,   [Year] = Year(Date)
  FROM   [Order]
 )
 ,   B AS (
  SELECT Customer
     ,   Orders = SUM(A.Orders)
     ,   [Year]
  FROM   A
  GROUP BY  
         Customer
    ,    A.[Year]
)
,    Orders2012 AS (
  SELECT *
  FROM   B
  WHERE  B.[Year] = 2012
)
,    Orders2013 AS (
   SELECT *
   FROM   B
   WHERE  B.[Year] = 2013
)
SELECT   O12.Customer
     ,   Orders2012 = O12.Orders
     ,   Orders2013   O13.Orders
     ,   TotalOrders = O12.Orders + O13.Orders
FROM    Orders2012 O12
    JOIN Orders2013 O13
        ON O12.Customer = O13.Customer

それを小さな処理に分割することで、私が何をしているのかがすべてのステップで明確になります(私は願っています)。私のSELECTはすべて単純です。私の質問は長いですが、理解、拡張、変更、または別の年の追加は簡単です。

于 2013-02-07T22:30:09.377 に答える