将每个字段作为不同记录的表转换为"normal"表



我必须使用以下字段来处理一个表(blddetails):bldgid(integer),resourceid(string),resourcevalue(string)(string)

>

建筑物的每个不同属性(资源ID最多50个可能的物品)都存储为单独的记录。因此,如果每个属性都有一年一度的属性,建筑物和质量的数据,则表中将有三个记录。例如,如果没有有关质量的信息,则将只有两个记录(年制造和建筑物)。我知道这可能不是正常的数据存储方法,但我无法修改表结构。

我需要做的是创建一个SQL,该SQL将绘制BLDGID,三个特定的资源ID(年制造,建筑物和质量)及其各自的价值从最多三个单独的记录中纳入具有以下字段的表格:Bldgid,年建造,建筑物和质量。

有什么想法?

将其分成几块,首先编写SQL,以获取每栋建筑物所需的值:

SELECT BldgID, ResourceValue FROM BldDetails WHERE ResourceID = "YearBuilt";
SELECT BldgID, ResourceValue FROM BldDetails WHERE ResourceID = "BuildingSize";
SELECT BldgID, ResourceValue FROM BldDetails WHERE ResourceID = "Quality";

也是一个查询,以获取所有独特的bldgid列表:

SELECT BldgID FROM BldDetails GROUP BY BldgID;

现在以独特的bldgid查询开始,留下与其他派生表/子征服的加入:

SELECT
    t1.Bldgid, t2.ResourceValue as "YearBuilt", t3.ResourceValue As "BuildingSize", t4.ResourceValue as "Quality"
FROM
    (SELECT BldgID FROM BldDetails GROUP BY BldgID) as t1
    LEFT OUTER JOIN (SELECT BldgID, ResourceValue FROM BldDetails WHERE ResourceID = "YearBuilt") as t2
        ON t1.BldgID = t2.BldgID
    LEFT OUTER JOIN (SELECT BldgID, ResourceValue FROM BldDetails WHERE ResourceID = "BuildingSize") as t3
        ON t1.BldgID = t3.BldgID
    LEFT OUTER JOIN (SELECT BldgID, ResourceValue FROM BldDetails WHERE ResourceID = "Quality") as t4
    ON t1.BldgID = t4.BldgID

尝试此

select BldgID, max(iif(ResourceID="YearBuilt",ResourceValue)) as YearBuilt from BldDetails

然后您可以将其扩展为其他资源。

最新更新