Объединение колонок в одну в сложном запросе Microsoft SQL
У меня вопрос похожий на этот.
Есть таблица Auftraege в которой есть колонка сумм Gewinn (Auftraege.Gewinn). К этой таблице через LEFT JOIN подключается 2 раза таблица Vertreterstamm с колонкой имен Suchname (Vertreterstamm.Suchname) через ключи Auftraege.Vertreter1 и Auftraege.Vertreter2. Именам (Vertreter1 и Vertreter2) присваиваются суммы Gewinn поровну если имена разные, если имя Vertreter1 и Vertreter2 одинаковое то сумма Gewinn дается только один раз этому имени.
Нужно пересобрать как-то таблицу, чтоб он выводил уникальные значения Vertreterstamm.Suchname с двух колонок Vertreter1 и Vertreter2, и суммировал для этих уникальных значений суммы Auftraege.Gewinn, когда эти уникальные значения были и Vertreter1, и Vertreter1.
Исходный результат:
Gewinn Vertreter_1 Vertreter_2
50 Maria Thomas
75 Maria Maria
40 Ivan Ivan
80 Ivan Thomas
100 Thomas Maria
Ожидаемый результат:
Gewinn Vertreter
225 Maria ///(50 + 75 + 100)
120 Ivan ///(40 + 80)
230 Thomas ///(50 + 80 + 100)
Версия СУБД: Microsoft SQL Server 2016 (SP2-CU11-GDR) (KB4535706) - 13.0.5622.0 (X64) Dec 15 2019 08:03:11 Copyright (c) Microsoft Corporation Standard Edition (64-bit) on Windows Server 2016 Standard 10.0 (Build 14393: ) (Hypervisor)
Скрин: http://prntscr.com/w6emru
Ссылка на dbfiddle: https://dbfiddle.uk/?rdbms=sqlserver_2019&fiddle=b2543a0efcb882fd275bb5dfd79ab148
CREATE TABLE Auftraege
(
Gewinn INT,
Vertreter1 INT,
Vertreter2 INT,
);
CREATE TABLE Vertreterstamm
(
OID INT,
Suchname VARCHAR(20) NOT NULL
);
INSERT Auftraege(Gewinn, Vertreter1, Vertreter2)
VALUES (50, 1, 3);
INSERT Auftraege(Gewinn, Vertreter1, Vertreter2)
VALUES (75, 1, 1);
INSERT Auftraege(Gewinn, Vertreter1, Vertreter2)
VALUES (40, 2, 2);
INSERT Auftraege(Gewinn, Vertreter1, Vertreter2)
VALUES (80, 2, 3);
INSERT Auftraege(Gewinn, Vertreter1, Vertreter2)
VALUES (100, 3, 1);
INSERT Vertreterstamm(OID, Suchname)
VALUES (1, 'Maria');
INSERT Vertreterstamm(OID, Suchname)
VALUES (2, 'Ivan');
INSERT Vertreterstamm(OID, Suchname)
VALUES (3, 'Thomas');
SELECT
Gewinn,
Vertreterstamm_1.Suchname AS Vertreter_1,
Vertreterstamm_2.Suchname AS Vertreter_2
FROM
Auftraege
LEFT JOIN Vertreterstamm Vertreterstamm_1 ON (Vertreterstamm_1.OID=Auftraege.Vertreter1)
LEFT JOIN Vertreterstamm Vertreterstamm_2 ON (Vertreterstamm_2.OID=Auftraege.Vertreter2)
Ответы (2 шт):
Если я верно понимаю задачу (которую я до сих пор не понимаю вообще), то требуется нечто близкое к
WITH
cte AS (SELECT Gewinn, Vertreter1 Vertreter FROM Auftraege
UNION ALL
SELECT Gewinn, Vertreter2 FROM Auftraege)
SELECT SUM(Gewinn) / 2 Gewinn, Vertreterstamm.Suchname AS Vertreter
FROM cte
LEFT JOIN Vertreterstamm ON (Vertreterstamm.OID=cte.Vertreter)
GROUP BY Vertreterstamm.Suchname
Даже если нужно что-то иное - адаптировать несложно, идея останется той же.
Появление требуемого ответа прояснило задачу. Как я и говорил - идея не меняется, нужна минимальная доработка.
WITH
cte AS (SELECT Gewinn, Vertreter1 Vertreter FROM Auftraege
UNION ALL
SELECT Gewinn, Vertreter2 FROM Auftraege WHERE Vertreter1 != Vertreter2)
SELECT SUM(Gewinn) Gewinn, Vertreterstamm.Suchname AS Vertreter
FROM cte
LEFT JOIN Vertreterstamm ON (Vertreterstamm.OID=cte.Vertreter)
GROUP BY Vertreterstamm.Suchname
Попробуйте следующее решение.
SQL
DECLARE @Auftraege TABLE (Gewinn INT,Vertreter1 INT,Vertreter2 INT);
INSERT INTO @Auftraege(Gewinn, Vertreter1, Vertreter2) VALUES
(50, 1, 3),
(75, 1, 1),
(40, 2, 2),
(80, 2, 3),
(100, 3, 1);
DECLARE @Vertreterstamm TABLE (OID INT,Suchname VARCHAR(20) NOT NULL);
INSERT INTO @Vertreterstamm(OID, Suchname) VALUES
(1, 'Maria'),
(2, 'Ivan'),
(3, 'Thomas');
-- Просто чтобы видеть
SELECT Gewinn
, Vertreter1
, IIF(Vertreter1 <> Vertreter2, Gewinn, IIF(Vertreter1 = Vertreter2,Gewinn,0)) AS Gewinn1
, Vertreter2
, IIF(Vertreter1 <> Vertreter2, Gewinn, 0) AS Gewinn2
FROM @Auftraege;
;WITH rs AS
(
SELECT Gewinn
, Vertreter1
, IIF(Vertreter1 <> Vertreter2, Gewinn, IIF(Vertreter1 = Vertreter2,Gewinn,0)) AS Gewinn1
, Vertreter2
, IIF(Vertreter1 <> Vertreter2, Gewinn, 0) AS Gewinn2
FROM @Auftraege
), cte AS
(
SELECT Vertreter1, SUM(Gewinn1) AS Gewinn FROM rs
GROUP BY Vertreter1
UNION ALL
SELECT Vertreter2, SUM(Gewinn2) AS Gewinn FROM rs
GROUP BY Vertreter2
)
SELECT v.*, SUM(Gewinn) AS Gewinn
FROM cte INNER JOIN @Vertreterstamm AS v
ON cte.Vertreter1 = v.OID
GROUP BY OID, Suchname
ORDER BY OID;
Результат
+-----+----------+--------+
| OID | Suchname | Gewinn |
+-----+----------+--------+
| 1 | Maria | 225 |
| 2 | Ivan | 120 |
| 3 | Thomas | 230 |
+-----+----------+--------+