2016-11-12 13 views
0

私は現在、新しいクエリを書く手助けが必要SQL Serverの2016 ...SQLは、日付

を使用していことで参加します。

売上高は、次のようになります。

enter image description here

Employeesテーブルには次のようになります。

enter image description here

私は、売上表からすべての行を呼び出し、スーパーバイザーをもたらすしたいと思いますフィールドを従業員テーブルから削除する必要がありますが、従業員テーブルのdate_toフィールドとdate_fromフィールドに基づいて参加するスーパーバイザフィールドが必要です。上司や営業担当者の配置が売上テーブルに日付に依存して、どこでその日付がDATE_FROMとDATE_TOフィールドの間に入るでしょう

enter image description here

:たとえば、これは私が私の出力は次のようになりたいものです従業員表に表示されます。このケースでは、11/4の最初の販売が2011年1月1日から2011年6月11日の間であったため、従業員表のsales_rep_idに参加したとき、監督者はJim Jonesになります。しかし、11/15/16に発生した売却は、2011年11月7日から1999年12月31日までの間に分類され、トム・ホールがスーパーバイザーとなる。

ご協力いただきましてありがとうございます。

+0

コードにカンマがありません。 – wildplasser

+0

使用するDBMSを指定してください –

+0

@EmilHolub SQL Server 2016 – user3067478

答えて

2

セットアップ:

create table Sales 
(
    sale_date DATE, 
    sales_rep_name NVARCHAR(100), 
    sales_rep_id INT, 
) 
GO 

insert into Sales VALUES 
    ('20161004', 'Old man', 123), 
    ('20161104', 'Smith, John', 12345), 
    ('20161115', 'Smith, John', 12345) 
GO 

create table Employees 
(
    sales_rep_name NVARCHAR(100), 
    sales_rep_id INT, 
    supervisor NVARCHAR(100), 
    date_from DATE, 
    date_to DATE 
) 
GO 

テスト:

INSERT INTO Employees VALUES ('Smith, John', 12345, 'Jones, Jim', '20160101', '20160611'), 
    ('Smith, John', 12345, 'Hall, Tom', '20160711', '99991231') 
GO 

-- gets all sales where INNER JOIN will go 
-- even if LEFT JOIN is used, BETWEEN applied to NULL will rule out some records 
SELECT S.sale_date, E.sales_rep_name, S.sales_rep_name, E.supervisor 
FROM Sales S 
    JOIN Employees E ON S.sales_rep_id = E.sales_rep_id 
     AND S.sale_date BETWEEN E.date_from and E.date_to 


UNION ALL

-- just NULL the columns for the rest of the records 
SELECT S.sale_date, NULL, S.sales_rep_name, NULL 
FROM Sales S 
    WHERE NOT EXISTS (SELECT 1 FROM Employees E WHERE E.sales_rep_id = S.sales_rep_id AND S.sale_date BETWEEN E.date_from and E.date_to) 

GO

+0

'WHERE S.sale_date BETWEEN'を' AND S.sale_date BETWEEN'に変更するだけで、 'UNION'の必要はありません:) – dnoeth

1

あなたの従業員テーブルがSlowly Changing Dimension Type 2いわゆるされ、あなたは外のような付加的な条件間の結合を必要とする:これは内部に結果を向けるだろうと

SELECT * 
FROM SALES AS sal 
LEFT JOIN EMPLOYEES AS emp 
    ON sal.SALES_REP_ID = emp.SALES_REP_ID 
AND sal.DATE BETWEEN emp.DATE_FROM AND emp.DATE_TO 

をWHEREでBETWEENを入れないでくださいもう一度参加してください。

1

私はLEFT JOINを提案していますので、売り上げを逃すことはありません。日付条件はLEFT JOINためON句で行く必要があることを

SELECT s.Date, e.sales_rep_name, s.sales_rep_id, e.supervisor 
FROM sales s LEFT JOIN 
    employees e 
    ON s.sales_rep_id = e.sales_rep_id AND 
     s.date >= e.date_from AND 
     s.date <= e.date_to; 

注:ここではそれを使用する正しい方法です。また、テーブルのエイリアスを使用すると、クエリを簡単に作成して読み取ることができます。売り上げに一致がない場合、salesの情報はNULLの値に設定され、employeesの列の値になります。