2016-01-21 29 views
0

我得到一個問題,我必須只返回客戶的名字和姓氏要麼編寫一個查詢來查找所有間歇性客戶(約會之間有6個月差距的人,或每年約有兩次約會的人)

  1. 一個約會每年

  • 2以下的約會年現有的預約表之間的6個月以上的差距。 下面是創建的約會表和客戶表

    CREATE TABLE [dbo].[Appointments](
    [pk_appointments] [int] IDENTITY(1,1) NOT NULL, 
    [k_client_info] [int] NOT NULL, 
    [date] [datetime] NOT NULL 
    ) ON [PRIMARY] 
    
    CREATE TABLE [dbo].[client_info](
    [pk_client_info] [int] IDENTITY(1,1) NOT NULL, 
    [first_name] [nvarchar](50) NOT NULL, 
    [last_name] [nvarchar](50) NOT NULL, 
    [phone] [nvarchar](50) NOT NULL, 
    ) ON [PRIMARY] 
    

    我的想法是寫兩個查詢同時滿足1和2,聯合在一起。我有2如下:

    SELECT DISTINCT first_name, last_name 
    FROM client_info 
    LEFT JOIN appointments ON pk_client_info = k_client_info 
    GROUP BY first_name, last_name, k_client_info, year(date) 
    HAVING COUNT(*) <= 2 
    

    ,但我有一些麻煩纏繞我的頭圍繞如何編寫將滿足1,這是找到所有客戶約會之間的大於6個月的空白查詢。我想過在client_info表上運行一個select並加入預約表兩次,並以某種方式讓他們排隊,並按正確的順序,以便我可以比較日期。也許我需要做一個ROW_NUMBER OVER PARTION BY k_client_info?

    任何幫助將不勝感激。感謝您的時間提前。

  • +0

    我會考慮具有兩個結構WHERE子句中的子查詢以及它們之間的OR。 –

    回答

    0
    SELECT a1.k_client_info 
    
    FROM [dbo].[Appointments] a1 
        CROSS APPLY (SELECT top 1 a2.[date], a2.[pk_appointments] 
            FROM [dbo].[Appointments] a2 
            WHERE a1.k_client_info = a2.k_client_info AND a1.[date] > a2.[date] 
            order by a2.[date] DESC) a3 
    WHERE DATEDIFF(MONTH, a3.[date], a1.[date]) >= 6 
    
    UNION ALL 
    
    SELECT k_client_info 
    FROM [dbo].[Appointments] 
    GROUP BY YEAR(DATE), k_client_info 
    HAVING COUNT(*) < 2 
    
    +0

    謝謝,這工作得很好! –

    0
    • LEFT OUTER JOIN委任表格本身t1.pk_client_info = t2.pk_client_info 和t1.date> t2.date
    • 找出最大t2.date - 這會給你每個約會的最後預約之前。

    從所得集,

    選擇k_client_info,通過k_client_info基,具有分鐘(DATEDIFF(毫米,日期,prior_date))> 5

    相關問題