有没有更简单的方法来格式化 SQL

时间:2021-07-23 14:00:47

标签: sql data-cleaning

我正在尝试格式化此数据集,以便在对其执行 SQL 时更易于使用。除了将所有列组合和更改为单个列之外,是否还有更简单的方法,以便我可以使用 SELECT 函数更轻松地调用它?例如,我希望能够在一个“疾病”列下包含所有疾病。在处理大量数据时,我无法复制粘贴重新排列数据

例如:

enter image description here

2 个答案:

答案 0 :(得分:0)

您可以使用一些技巧来做到这一点,实际上您希望将列UNPIVOT 转化为行。

MS SQL UNPIVOT:http://sqlfiddle.com/#!18/39bc16/2

SELECT [Entity],[Code],[Year],[Disease],[Rate]
FROM [Results]
UNPIVOT ([Rate] FOR [Disease] 
          IN ([Cardiovascular],[Neoplasm],[Respiratory],[Diabetes],[Alzheimers]) 
) AS [ResultsSource]
<头>
实体 代码 疾病
阿富汗 AFG 1990 心血管 23.70775
阿富汗 AFG 1990 肿瘤 5.129907
阿富汗 AFG 1990 呼吸系统 3.036222
阿富汗 AFG 1990 糖尿病 3.832555
阿富汗 AFG 1990 老年痴呆症 0.999691
阿富汗 AFG 1991 心血管 23.49031
阿富汗 AFG 1991 肿瘤 5.086501
阿富汗 AFG 1991 呼吸系统 3.012502
阿富汗 AFG 1991 糖尿病 3.822228
阿富汗 AFG 1991 老年痴呆症 0.994872
<块引用>

在规范化的数据库中,EntityDisease 将在它们自己的表中定义,并通过 FK 链接。代码通常会在 Entity 表中关联。

并非所有数据库都提供UNPIVOT函数,如this article中所述,还有一些其他方法可以生成相同的结果集,对于少量列,一个简单的UNION ALL可以做同样的事情:http://sqlfiddle.com/#!18/39bc16/4

SELECT [Entity],[Code],[Year],'Cardiovascular' as [Disease], [Cardiovascular] as [Rate]
FROM [Results]
UNION ALL
SELECT [Entity],[Code],[Year],'Neoplasm' as [Disease], [Neoplasm] as [Rate]
FROM [Results]
UNION ALL
SELECT [Entity],[Code],[Year],'Respiratory' as [Disease], [Respiratory] as [Rate]
FROM [Results]
UNION ALL
SELECT [Entity],[Code],[Year],'Diabetes' as [Disease], [Diabetes] as [Rate]
FROM [Results]
UNION ALL
SELECT [Entity],[Code],[Year],'Alzheimers' as [Disease], [Alzheimers] as [Rate]
FROM [Results]

有关如何使用此输出存储到规范化结构的示例,请查看此小提琴:http://sqlfiddle.com/#!18/66eba/2

答案 1 :(得分:0)

使用:

INSERT INTO new_table (...)
SELECT ..., disease_val_col1 FROM old_table UNION
SELECT ..., disease_val_col2 FROM old_table UNION
...
;

像这样填充表格:

CREATE TABLE stats (
    id       int primary key auto_increment
  , region   int
  , year     int
  , disease  int
  , curval   decimal(9, 7)
  , code     VARCHAR(30)
  , foreign key (disease) references disease(id)
  , foreign key (region)  references regions(id)
  , foreign key (code)    references codes(code)
);

连同地区、代码、疾病等的其他表格。 要获取要在 stats 表中使用的关联主键值,还有一些工作要做。

查看“数据库规范化”等概念,了解有关设计/构建表格的方法的更多详细信息。

相关问题