私は考えている:
-- 1. SAMPLE DATA
DECLARE @locality TABLE (localityid int, locality int);
DECLARE @job TABLE (id int, Job varchar(100));
DECLARE @person TABLE
(
name varchar(100),
surname varchar(100),
jobid int,
localityid int,
salary money,
gender char(1)
);
INSERT @locality VALUES (1, 10), (2, 20), (3, 35), (4, 1000);
INSERT @job VALUES (1, 'C# Developer'), (2, 'DBA');
INSERT @person VALUES
('joe', 'blow', 1, 1, 100000, 'M'),
('Sally', 'Doe', 1, 2, 135000, 'F'),
('Sue', 'Smith', 2, 2, 115000, 'F'),
('Kyle', 'Jones', 2, 3, 107500, 'M')
;
-- 2. SOLUTION:
SELECT gender = NULL, job = NULL, average = AVG(p.salary)
FROM @person p
UNION ALL
SELECT p.gender, job = NULL, average = AVG(p.salary)
FROM @person p
JOIN @job j ON p.jobid = j.id
GROUP BY p.gender
UNION ALL
SELECT gender = NULL, job = j.job, average = AVG(p.salary)
FROM @person p
JOIN @job j ON p.jobid = j.id
GROUP BY j.Job
UNION ALL
SELECT p.gender, j.Job, average = AVG(p.salary)
FROM @person p
JOIN @job j ON p.jobid = j.id
GROUP BY p.gender, j.Job
FOR XML RAW;
戻り値:
<row average="114375.0000" />
<row gender="F" average="125000.0000" />
<row gender="M" average="103750.0000" />
<row job="C# Developer" average="117500.0000" />
<row job="DBA" average="111250.0000" />
<row gender="F" job="C# Developer" average="135000.0000" />
<row gender="M" job="C# Developer" average="100000.0000" />
<row gender="F" job="DBA" average="115000.0000" />
<row gender="M" job="DBA" average="107500.0000" />
こんにちは、良いアプローチ、私の側から+1(と私はあなたのサンプルデータを借りて、これのために)。私の答えは、 'ROLLUP'を使ってはるかに簡単なアプローチを示しています。興味深いかもしれません... – Shnugo
非常によくshnugoを行いました。私はそれを考えていたはずです。 –