2013-11-15 23 views
0

我正在處理數以千計的客戶的數據庫。使用COUNT和UNION提取數據並支持場景

我想找到一組具有恰好一張有效的合格優惠券的單一客戶組,並且恰好有一張有效的非合格優惠券。

  1. 合格優惠券是最低消費金額爲0.01英鎊或更高的優惠券。
  2. 不符合條件的優惠券是沒有最低支出的優惠券,因此£0.00
  3. 「有效」指的是「從」日期爲今天或之前,以及「至」日期爲今天或在未來

我已經初步建立了下面的查詢,但是這一切正在做的是尋找誰擁有有效的合格和不合格的憑證的所有客戶。我試圖找到誰只有一個有效的合格憑證和JUST ONE不合資格憑證的客戶:

select CustomerId, VoucherId, MinimumSpendAmount, ValidFromDate, ValidToDate 
from dbo.discountvoucher 
where ValidFromDate <= 15/11/2013 
and ValidToDate >= 15/11/2013 
order by CustomerId 

,我想我需要將此分成2條獨立的SELECT語句,一個有1個合格的憑證找單個客戶(使用COUNT),另外一個使用1張非合格代金券(使用COUNT)查找單個客戶。然後將它們與UNION結合。但我可能是完全錯誤的......

請任何人可以幫助

+0

您是否嘗試過聯合? –

+1

工會不會解決問題。我認爲它需要做COUNT以及count = 1,但我不知道如何做到這一點...... – user1278496

回答

2

您可以使用一個子與一個GROUP BY和HAVING子句中選擇最符合條件的客戶。

select CustomerId, VoucherId, MinimumSpendAmount, ValidFromDate, ValidToDate 
from dbo.discountvoucher 
where ValidFromDate <= 15/11/2013 
and ValidToDate >= 15/11/2013 
and CustomerId in 
    (select CustomerId 
    from dbo.discountvoucher 
    where ValidFromDate <= 15/11/2013 
    and ValidToDate >= 15/11/2013 
    group by CustomerId 
    having sum(case when MinimumSpendAmount > 0 then 1 else 0 end) = 1 
    and sum(case when MinimumSpendAmount = 0 then 1 else 0 end) = 1 
    ) 
order by CustomerId