1

我有3张桌子..

House1 House2 results

    house1
    ID,  Name,  Monday,  Tuesday
     1   john     1         1
     2   jack     1         0

    House2
    ID,  Name,  Monday,  Tuesday
     3   Dan      0         0
     1   John     1         0

我想填表results,像这样:

    results
    ID,  Name,  Total
    1    john     3
    2    jack     1
    3    dan      0

我使用 IIF() 来计算天数..但它
使用类似于以下内容的方式制作了重复的行:

INSERT INTO results (ID, name, total)
SELECT ID, name, IIf([house1.monday]>0,1,0)+
                 IIf([house2.monday]>0,1,0)+
                 IIf([house1.tuesday]>0,1,0)+
                 IIF([house2.tuesday]>0,1,0) as TOTAL
FROM house1,house2
WHERE House1.ID = House2.ID

这显然是行不通的,因为它只插入john.

4

3 回答 3

0

尝试这个:

INSERT INTO results
SELECT Id, Name, SUM(Monday) + SUM (Tuesday)
FROM (
SELECT Id, Name, Monday, Tuesday FROM house1
UNION
SELECT Id, Name, Monday, Tuesday FROM house2)
group by Id;

您可以访问http://www.compileonline.com/execute_sql_online.php并尝试以下代码:

BEGIN TRANSACTION;

DROP TABLE IF EXISTS House1;
DROP TABLE IF EXISTS House2;
DROP TABLE IF EXISTS results;

CREATE TABLE House1(Id integer PRIMARY KEY, Name text, Monday integer,  Tuesday integer);
CREATE TABLE House2(Id integer PRIMARY KEY, Name text, Monday integer,  Tuesday integer);
CREATE TABLE results(Id integer PRIMARY KEY, Name text, Total integer);

INSERT INTO House1 VALUES(1,'john', 1, 1);
INSERT INTO House1 VALUES(2,'jack', 1, 0);
INSERT INTO House2 VALUES(3,'Dan', 0, 0);
INSERT INTO House2 VALUES(1,'john', 1, 0);
COMMIT;

INSERT INTO results
SELECT Id, Name, SUM(Monday) + SUM (Tuesday)
FROM (
SELECT Id, Name, Monday, Tuesday FROM house1
UNION
SELECT Id, Name, Monday, Tuesday FROM house2)
GROUP BY Id;

SELECT * FROM results;
于 2013-07-23T14:33:55.967 回答
0

您认识到您的查询存在问题。内连接只保留匹配的行。

您可以改为使用保留所有行union all。以下计算total每个表的 ,然后用于aggregation对它们求和:

INSERT INTO results(ID, name, total)
    SELECT ID, name, SUM(Total) as TOTAL
    FROM ((select h1.id, IIf([h1.monday]>0,1,0) + IIf([h1.tuesday]>0,1,0) as Total
           from house1 h1
          ) union all
          (select h2.id, IIf([h2.monday]>0,1,0) + IIf([h2.tuesday]>0,1,0) as Total
           from house2 h2
          )
         ) h
    group by id, name;

编辑

您更改了评论中的问题。但是,您只需做同样的事情,在子查询中定义您需要的列:

INSERT INTO results(ID, name, totalMonday, totalTuesday, total)
    SELECT ID, name, SUM(Monday), SUM(Tuesday), SUM(Monday)+Sum(Tuesday) as TOTAL
    FROM ((select h1.id, IIf([h1.monday]>0,1,0) as Monday, IIf([h1.tuesday]>0,1,0) as Tuesday
           from house1 h1
          ) union all
          (select h2.id, IIf([h2.monday]>0,1,0) as Monday, IIf([h2.tuesday]>0,1,0) as Tuesday
           from house2 h2
          )
         ) h
    group by id, name;
于 2013-07-23T14:27:05.520 回答
0

怎么样的东西

SELECT ID, Name, SUM(Monday)+SUM(Tuesday) as Total
FROM
(
SELECT ID, Name, Monday, Tuesday
FROM House1
Union ALL
SELECT ID, Name, Monday, Tuesday
FROM House2
) a
Group BY a.ID, a.Name
于 2013-07-23T14:14:48.713 回答