Как подвести итоги объединенной таблицы в sqlite? - PullRequest
0 голосов
/ 12 апреля 2019

Что мне делать, если я хочу суммировать столбец численности персонала из объединенной таблицы?

Я пытался использовать этот запрос:

SELECT A.Job, A.Site, count(B.Job) HeadCount FROM tble_1 A LEFT join tble_2 B ON A.Job = B.Job AND A.Site = B.Site GROUP BY A.Job

RESULT:
+----------------+----------------+----------------+
| Jobs           | Site           | Headcount      |
+----------------+----------------+----------------+
|       Doctor   |             US |             10 |
+----------------+----------------+----------------+
|       Artist   |         Mexico |             10 | 
+----------------+----------------+----------------+
|       Doctor   |          Japan |             10 | 
+----------------+----------------+----------------+
|       Doctor   |        Germany |             10 | 
+----------------+----------------+----------------+
|       Doctor   |         Russia |             10 | 
+----------------+----------------+----------------+
|       Actor    |          India |             10 | 
+----------------+----------------+----------------+

Как мне достичь этого результата:

+----------------+----------------+----------------+----------------+
| Jobs           | Site           | Headcount      | Total          |
+----------------+----------------+----------------+----------------+
|       Doctor   |             US |             10 |             30 |
+----------------+----------------+----------------+----------------+
|       Artist   |         Mexico |             10 |             10 |
+----------------+----------------+----------------+----------------+
|       Doctor   |          Japan |             10 |             30 |
+----------------+----------------+----------------+----------------+
|       Doctor   |        Germany |             10 |             30 |
+----------------+----------------+----------------+----------------+
|       Actor    |         Russia |             10 |             20 |
+----------------+----------------+----------------+----------------+
|       Actor    |          India |             10 |             20 |
+----------------+----------------+----------------+----------------+

Примечание. Столбец итога представляет собой сумму численности персонала.

Ответы [ 3 ]

0 голосов
/ 12 апреля 2019

Мы можем попробовать использовать два отдельных подзапроса для каждого счета:

SELECT
    t1.Job,
    t1.Site,
    COALESCE(t3.HeadCount, 0) AS HeadCount,
    COALESCE(t2.SiteCount, 0) AS Total
FROM tble_1 t1
LEFT JOIN
(
    SELECT Job, COUNT(*) AS SiteCount
    FROM tble_1 
    GROUP BY Job
) t2
    ON t1.Job = t2.Job
LEFT JOIN
(
    SELECT A.Job, A.Site, COUNT(*) AS HeadCount
    FROM tble_1 A
    LEFT JOIN tble_2 B
        ON A.Job = B.Job AND A.Site = B.Site
    GROUP BY A.Job, A.Site
) t3
    ON t1.Job = t3.Job AND t1.Site = t3.Site;

Демо

(демонстрационные данные любезно предоставлены @Shawn) * +1010 *

0 голосов
/ 12 апреля 2019

Ваш пример выходных данных не может быть получен по запросу в вашем посте (вы группируете только по одному столбцу, а результаты основаны на группировке по двум столбцам; для каждого запроса должна быть только одна строка), и нет примеров данных для тестирования, так что исправляя это, я думаю, что это будет делать то, что вы хотите (требуется Sqlite 3.25 или новее):

SELECT a.job AS Job
     , a.site AS Site
     , count(b.job) AS Headcount
     , sum(count(b.job)) OVER (PARTITION BY a.job) AS Total
FROM tble_1 AS a
LEFT JOIN tble_2 AS b ON a.job = b.job AND a.site = b.site
GROUP BY a.job, a.site;

Учитывая следующие данные образца:

CREATE TABLE tble_1(job text, site text);
INSERT INTO tble_1 VALUES('Doctor','US');
INSERT INTO tble_1 VALUES('Doctor','Japan');
INSERT INTO tble_1 VALUES('Doctor','Germany');
INSERT INTO tble_1 VALUES('Artist','Mexico');
INSERT INTO tble_1 VALUES('Actor','Russia');
INSERT INTO tble_1 VALUES('Actor','India');
INSERT INTO tble_1 VALUES('Actor','Mexico');
CREATE TABLE tble_2(job text, site text);
INSERT INTO tble_2 VALUES('Doctor','US');
INSERT INTO tble_2 VALUES('Doctor','Japan');
INSERT INTO tble_2 VALUES('Doctor','Germany');
INSERT INTO tble_2 VALUES('Artist','Mexico');
INSERT INTO tble_2 VALUES('Actor','Russia');
INSERT INTO tble_2 VALUES('Actor','India');
INSERT INTO tble_2 VALUES('Doctor','Germany');
CREATE INDEX tble_1_idx ON tble_1(job, site);
CREATE INDEX tble_2_idx ON tble_2(job, site);

это производит:

Job         Site        Headcount   Total     
----------  ----------  ----------  ----------
Actor       India       1           2         
Actor       Mexico      0           2         
Actor       Russia      1           2         
Artist      Mexico      1           1         
Doctor      Germany     2           4         
Doctor      Japan       1           4         
Doctor      US          1           4    
0 голосов
/ 12 апреля 2019

использовать скалярный подзапрос

SELECT A.Job, A.Site, count(B.Job) HeadCount,
(select count(*) FROM tble_1 A1 where A.job=A1.job) as total
FROM tble_1 A LEFT join tble_2 B ON A.Job = B.Job AND A.Site = B.Site 
GROUP BY A.Job
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...