データベースサーバーの種類= SQL Server 2012 SP2データが変更されたときにデータ値を返すための照会を探す
ここにソーステーブルがあります。
CREATE TABLE a
(
e_id INT,
r_id INT,
d_id INT,
s_id INT
);
CREATE TABLE r
(
id INT,
NAME VARCHAR(50)
);
CREATE TABLE d
(
id INT,
calldate DATE
);
CREATE TABLE e
(
id INT,
NAME VARCHAR(50),
initial VARCHAR(5)
);
CREATE TABLE s
(
id INT,
specialty VARCHAR(50)
);
INSERT INTO a
VALUES (8,
13,
9,
13),
(8,
13,
10,
13),
(8,
13,
11,
13),
(8,
13,
12,
13),
(8,
13,
13,
13),
(8,
13,
14,
13),
(10,
13,
15,
13),
(10,
13,
16,
13),
(10,
13,
17,
13),
(16,
13,
18,
13),
(16,
13,
19,
13),
(16,
13,
20,
13),
(9,
13,
21,
13),
(9,
13,
22,
13),
(9,
13,
23,
13),
(9,
13,
24,
13),
(16,
13,
25,
13),
(16,
13,
26,
13);
INSERT INTO a
VALUES
(10,22,9,13),
(10,22,10,13),
(10,22,11,13),
(10,22,12,13),
(10,22,13,13),
(16,22,14,13),
(16,22,15,13),
(16,22,16,13),
(16,22,17,13),
(9,22,18,13),
(9,22,19,13),
(9,22,20,13),
(18,22,21,13),
(18,22,22,13),
(10,22,23,13),
(10,22,24,13),
(9,22,25,13),
(9,22,26,13);
INSERT INTO r
VALUES (13,
'Primary'),
(22,
'Secondary'),
(33,
'Prim Trd'),
(44,
'Sec Td');
INSERT INTO e
VALUES (8,
'Jack',
'JM'),
(9,
'Ace',
'AQ'),
(10,
'Mike',
'MM'),
(16,
'George',
'GH'),
(18 ,'Bill', 'BK' );
INSERT INTO s
VALUES (13,
'Pediatric'),
(28,
'EMT'),
(55,
'ER');
INSERT INTO d
VALUES (9 , '2015-01-09'),
(10 , '2015-01-10'),
(11 , '2015-01-11'),
(12 , '2015-01-12'),
(13 , '2015-01-13'),
(14 , '2015-01-14'),
(15 , '2015-01-15'),
(16 , '2015-01-16'),
(17 , '2015-01-17'),
(18 , '2015-01-18'),
(19 , '2015-01-19'),
(20 , '2015-01-20'),
(21 , '2015-01-21'),
(22 , '2015-01-22'),
(23 , '2015-01-23'),
(24 , '2015-01-24'),
(25 , '2015-01-25'),
(26 , '2015-01-26'),
(27 , '2015-01-27'),
(28 , '2015-01-28'),
(29 , '2015-01-29'),
(30 , '2015-01-30')
表Aは、表D、E、R、およびS
表
║ e_id │ r_id │ d_id │ s_id ║
╠══════╪══════╪══════╪══════╣
║ 8 │ 13 │ 9 │ 13 ║
║ 8 │ 13 │ 10 │ 13 ║
║ 8 │ 13 │ 11 │ 13 ║
║ 8 │ 13 │ 12 │ 13 ║
║ 8 │ 13 │ 13 │ 13 ║
║ 8 │ 13 │ 14 │ 13 ║
║ 10 │ 13 │ 15 │ 13 ║
║ 10 │ 13 │ 16 │ 13 ║
║ 10 │ 13 │ 17 │ 13 ║
║ 16 │ 13 │ 18 │ 13 ║
║ 16 │ 13 │ 19 │ 13 ║
║ 16 │ 13 │ 20 │ 13 ║
║ 9 │ 13 │ 21 │ 13 ║
║ 9 │ 13 │ 22 │ 13 ║
║ 9 │ 13 │ 23 │ 13 ║
║ 9 │ 13 │ 24 │ 13 ║
║ 16 │ 13 │ 25 │ 13 ║
║ 16 │ 13 │ 26 │ 13 ║
║ 10 │ 22 │ 9 │ 13 ║
║ 10 │ 22 │ 10 │ 13 ║
║ 10 │ 22 │ 11 │ 13 ║
║ 10 │ 22 │ 12 │ 13 ║
║ 10 │ 22 │ 13 │ 13 ║
║ 16 │ 22 │ 14 │ 13 ║
║ 16 │ 22 │ 15 │ 13 ║
║ 16 │ 22 │ 16 │ 13 ║
║ 16 │ 22 │ 17 │ 13 ║
║ 9 │ 22 │ 18 │ 13 ║
║ 9 │ 22 │ 19 │ 13 ║
║ 9 │ 22 │ 20 │ 13 ║
║ 18 │ 22 │ 21 │ 13 ║
║ 18 │ 22 │ 22 │ 13 ║
║ 10 │ 22 │ 23 │ 13 ║
║ 10 │ 22 │ 24 │ 13 ║
║ 9 │ 22 │ 25 │ 13 ║
║ 9 │ 22 │ 26 │ 13 ║
表D
║ id │ calldate ║
╠════╪════════════╣
║ 9 │ 2015-01-09 ║
║ 10 │ 2015-01-10 ║
║ 11 │ 2015-01-11 ║
║ 12 │ 2015-01-12 ║
║ 13 │ 2015-01-13 ║
║ 14 │ 2015-01-14 ║
║ 15 │ 2015-01-15 ║
║ 16 │ 2015-01-16 ║
║ 17 │ 2015-01-17 ║
║ 18 │ 2015-01-18 ║
║ 19 │ 2015-01-19 ║
║ 20 │ 2015-01-20 ║
║ 21 │ 2015-01-21 ║
║ 22 │ 2015-01-22 ║
║ 23 │ 2015-01-23 ║
║ 24 │ 2015-01-24 ║
║ 25 │ 2015-01-25 ║
║ 26 │ 2015-01-26 ║
║ 27 │ 2015-01-27 ║
║ 28 │ 2015-01-28 ║
║ 29 │ 2015-01-29 ║
║ 30 │ 2015-01-30 ║
表E
を連結する連結テーブルであります╔════╤════════╤═════════╗
║ id │ name │ initial ║
╠════╪════════╪═════════╣
║ 8 │ Jack │ JM ║
║ 9 │ Ace │ AQ ║
║ 10 │ Mike │ MM ║
║ 16 │ George │ GH ║
║ 18 │ Bill │ BK ║
╚════╧════════╧═════════╝
表R
╔════╤═══════════╗
║ id │ name ║
╠════╪═══════════╣
║ 13 │ Primary ║
║ 22 │ Secondary ║
║ 33 │ Prim Trd ║
║ 44 │ Sec Td ║
╚════╧═══════════╝
表ここでS
|ID | Specialty |
|---+-----------|
|13 | Pediatric |
|28 | EMT |
|55 | ER |
私が考えていたクエリが動作しますが、エラーを生成します。ここでは
SELECT d.calldate,
Max(CASE
WHEN s.id = 13
AND r.NAME = 'Primary' THEN (e.NAME)
END) AS [Primary],
Max(CASE
WHEN s.id = 13
AND r.NAME = 'Secondary' THEN (e.NAME)
END) AS [Secondary],
Max(CASE
WHEN s.id = 13
AND r.NAME = 'Primary'
AND ((e.id = (SELECT e1.id
FROM a a1
INNER JOIN e e1
ON e1.id = a1.e_id
INNER JOIN d d1
ON d1.id = a1.d_id
INNER JOIN s s1
ON s1.id = a1.s_id
INNER JOIN r r1
ON r1.id = a1.r_id
WHERE d1.calldate = CONVERT(DATE,
Dateadd(dd, -1,
d.calldate),
101)
AND r1.NAME = 'Primary'
AND s1.id = 13))
AND (e.id = (SELECT e1.id
FROM a a1
INNER JOIN e e1
ON e1.id = a1.e_id
INNER JOIN d d1
ON d1.id = a1.d_id
INNER JOIN s s1
ON s1.id = a1.s_id
INNER JOIN r r1
ON r1.id = a1.r_id
WHERE d1.calldate = CONVERT(DATE, Dateadd
(dd, 1,
d.calldate),
101
)
AND r1.NAME = 'Primary'
AND s1.id = 13))) THEN ' '
ELSE e.initial
END) AS [PrimaryINIT],
Max(CASE
WHEN s.id = 13
AND r.NAME = 'Secondary'
AND (e.id = (SELECT e1.id
FROM a a1
INNER JOIN e e1
ON e1.id = a1.e_id
INNER JOIN d d1
ON d1.id = a1.d_id
INNER JOIN s s1
ON s1.id = a1.s_id
INNER JOIN r r1
ON r1.id = a1.r_id
WHERE d1.calldate = CONVERT(DATE, Dateadd(dd, -1,
d.calldate),
101)
AND r1.NAME = 'Secondary'
AND s1.id = 13)
AND (e.id = (SELECT e1.id
FROM a a1
INNER JOIN e e1
ON e1.id = a1.e_id
INNER JOIN d d1
ON d1.id = a1.d_id
INNER JOIN s s1
ON s1.id = a1.s_id
INNER JOIN r r1
ON r1.id = a1.r_id
WHERE d1.calldate = CONVERT(DATE, Dateadd(dd, 1,
d.calldate),
101
)
AND r1.NAME = 'Secondary'
AND s1.id = 13))) THEN ' '
ELSE e.initial
END) AS [SecondaryINIT]
FROM a
INNER JOIN e
ON e.id = a.e_id
INNER JOIN d
ON d.id = a.d_id
INNER JOIN s
ON s.id = a.s_id
INNER JOIN r
ON r.id = a.r_id
WHERE Datepart(mm, d.calldate) = 1
AND Datepart(year, d.calldate) = 2015
GROUP BY d.calldate
は、私たちが求めている結果がありますのクエリからです。
(初期列のみデータの変更前と後の列の値を返していることに注意してください):クエリから望ましい結果。
╔════════════╤═════════╤═══════════╤═════════╤═══════════╗
║ callDate │ Primary │ Secondary │ PrimINIT│ SeconINIT ║
╠════════════╪═════════╪═══════════╪═════════╪═══════════╣
║ 2015-01-09 │ Jack │ Mike │ JM │ MM ║
║ 2015-01-10 │ Jack │ Mike │ │ ║
║ 2015-01-11 │ Jack │ Mike │ │ ║
║ 2015-01-12 │ Jack │ Mike │ │ ║
║ 2015-01-13 │ Jack │ Mike │ │ MM ║
║ 2015-01-14 │ Jack │ George │ JM │ GH ║
║ 2015-01-15 │ Mike │ George │ MM │ ║
║ 2015-01-16 │ Mike │ George │ │ ║
║ 2015-01-17 │ Mike │ George │ MM │ GH ║
║ 2015-01-18 │ George │ Ace │ GH │ AQ ║
║ 2015-01-19 │ George │ Ace │ │ ║
║ 2015-01-20 │ George │ Ace │ GH │ AQ ║
║ 2015-01-21 │ Ace │ Bill │ AQ │ BK ║
║ 2015-01-22 │ Ace │ Bill │ │ BK ║
║ 2015-01-23 │ Ace │ Mike │ │ MM ║
║ 2015-01-24 │ Ace │ Mike │ AQ │ MM ║
║ 2015-01-25 │ George │ Ace │ GH │ AQ ║
║ 2015-01-26 │ George │ Ace │ GH │ AQ ║
╚════════════╧═════════╧═══════════╧═════════╧═══════════╝
次の時間与えられたデータと結果を、これは非常に良い質問があるフォーマットのほかに適切な整形自分 – PaulH
を提供してください:完全なコードでテストシナリオ、自分の努力、期待される出力、明確な説明。 upvoteに値する! – Shnugo
SQL Serverのどのバージョンですか? – Shnugo