mysql, подсчитайте разные значения между двумя таблицами (V2) - PullRequest
0 голосов
/ 26 апреля 2019

У меня есть две таблицы:

CREATE TABLE TableA  
(ID_A INT,   
 P1 INT,
 P2 INT,
 P3 INT,
 P4 INT,
 Nr1 INT,
 Nr2 INT,
 Nr3 INT,
 Nr4 INT);

INSERT INTO TableA VALUES
(1,3,4,3,5,2,3,1,4),
(2,5,4,3,4,1,1,1,2);

CREATE TABLE TableB
(ID_B INT,
NAME TEXT);

INSERT INTO TableB VALUES
(1,"A"),
(2,"B"),
(3,"C"),
(4,"D"),
(5,"E"),
(6,"F");

Значения в таблицах

TableA
+------+----+----+----+-----+----+----+----+-----+
| ID_A | P1 | P2 | P3 | P4  | Nr1| Nr2| Nr3| Nr4 |
+------+----+----+----+-----+----+----+----+-----+
|    1 |  3 |  4 |  3 |   5 |  2 |  3 |  1 |  4  |
|    2 |  5 |  4 |  3 |   4 |  1 |  1 |  1 |  2  |
+------+----+----+----+-----+----+----+----+-----+

TableB
+------+------+
| ID_B | Name |
+------+------+
|    1 | A    |
|    2 | B    |
|    3 | C    |
|    4 | D    |
|    5 | E    |
|    6 | F    |
+------+------+

tableA P1 = TableB ID_B,

tableA P2 = TableB ID_B,

tableA P3 = TableB ID_B,

tableA P4 = TableB ID_B

Я хочу получить сумму всех имен в Таблице B, которые соответствуют в P1, P2, P3, P4; а Nr1, Nr2, Nr3, Nr4 - это количество:

P1 = SUM Nr1

P2 = SUM Nr2

P3 = СУММА Nr3

P4 = СУММА №4

Я хочу получить это:

+----------+------+
| COUNT(*) | Name |
+----------+------+
|        4 | C    |
|        6 | D    |
|        5 | E    |
+----------+------+

My DEMO db-fiddle.com

Демо не складывается Nr.

Спасибо тем, кто мне поможет.

Ответы [ 3 ]

1 голос
/ 26 апреля 2019

В вашей скрипке вы не выбираете соответствующее значение Nr1 / 2/3/4.Добавьте их в предложение select и сложите их:

SELECT Name, SUM(Val)
FROM (
    SELECT TableB.Name, TableA.Nr1 AS Val FROM TableA JOIN TableB ON TableA.P1 = TableB.ID_B UNION ALL
    SELECT TableB.Name, TableA.Nr2 AS Val FROM TableA JOIN TableB ON TableA.P2 = TableB.ID_B UNION ALL
    SELECT TableB.Name, TableA.Nr3 AS Val FROM TableA JOIN TableB ON TableA.P3 = TableB.ID_B UNION ALL
    SELECT TableB.Name, TableA.Nr4 AS Val FROM TableA JOIN TableB ON TableA.P4 = TableB.ID_B
) AS x
GROUP BY Name
1 голос
/ 26 апреля 2019

В качестве альтернативы, если вы хотите сделать это без необходимости подзапроса:

  SELECT Name, 
         SUM(IF(P1 = ID_B, Nr1, 0) +
             IF(P2 = ID_B, Nr2, 0) +
             IF(P3 = ID_B, Nr3, 0) +
             IF(P4 = ID_B, Nr4, 0))
    FROM TableA
    JOIN TableB ON (TableA.P1 = TableB.ID_B
                    OR TableA.P2 = TableB.ID_B
                    OR TableA.P3 = TableB.ID_B
                    OR TableA.P4 = TableB.ID_B)
GROUP BY Name;
0 голосов
/ 26 апреля 2019

Вы можете использовать выбор UNION ALL и группировать по

  select t2.name, count(*)
  from TableB t2
  inner join  (
  select  p1 p 
  from TableA 
  union all 
  select  p2
  from TableA 
  union all 
  select  p3
  from TableA 
  union all 
  select  p4
  from TableA 
  ) t on t.p = t2.ID_B
  group t2.name
  order by count(*) desc
...