python - Excel 到 SQL 并处理重复值

标签 python sql r data-manipulation

工作表 1 中的查找表。

ID      CODE  REASSIGN(CODE)
W12-05  AA    ZZ
W12-05  BB    ZZ
W14-01  CC    CC
W14-03  AA    AA
W15-01  DD    DD
W15-01  DD    DD

ID 和 CODE 从报告中生成

重新分配(代码)是我想要完成的任务。如果有多个相同但 CODE 值不同的 ID(例如 W12-05),则将其分配给 "ZZ"。但是,如果有多个 ID 并且它们都具有相同的 CODE 值(例如 W15-01),则将其分配给相同的代码值。

有 2 个工作表(工作表 2 和工作表 3)包含 ID 以及与该 ID 关联的不同数据。

数据表:

ID      LOOKUP REASSIGN(CODE)
W12-05  ZZ
W14-01  CC
W14-03  AA
W15-01  DD

如何完成第一个表中的 REASSIGN(CODE) 列?大致如下:

如果 ID 重复并且有多个不同的 CODE,则分配给 ZZ。 如果ID重复并且代码相同,则分配给相同的代码。

在某些情况下,如果重复 ID 存在多个代码,则需要分配给特定的代码。当我不知道应该去哪里并且可以由其他部门处理时,“ZZ”是默认值。有时我知道代码“EE”和代码“FF”属于一个部门,并且有逻辑将其分配给例如“GG”。

我想根据 ID 列合并所有 3 个工作表,并且希望工作表 2 和工作表 3 中的所有数据都在那里,即使 ID 不匹配也是如此。工作表 1 将用作查找以提取 REASSIGN(CODE)。

如果我需要进一步解释或有任何问题,请告诉我。我对想法和其他解决方案持开放态度,因为这只是我脑海中的逻辑。我不确定是否为 REASSIGN(CODE) 创建另一个表更好,或者我的逻辑是否合理。

Original Question - RESOLVED

Combination of IF, REPLACE, and & - I am happy to provide more details.

I have 3 workbooks I am pulling data from and I do perform some data manipulation.

Here are the formulas I currently have in my spreadsheet:

Column: OB

Formula: =SUBSTITUTE(SUBSTITUTE([@[OBN]]," ",""),"-","")

This cleans up the OBN column removing all hyphens and spaces to standardize it based on the data table.

Column: DO

Formula:

=IF(OR([@[DON]]="NA",ISBLANK(TRIM([@[DON]])),[@[DON]]="N/A",ISNA([@[DON]]),ISBLANK([@[DON]])),"",[@[DON]])

This makes the DO column blank if there is no value there or if it's NA or N/A, as that is how the report displays it. Otherwise, use the value of DON as DO.

Column: OB+DO (This is the ID in the tables below)

Formula:

=IF([@DO]="",[@OB],CONCATENATE([@OB],"-",[@DO]))

Concatenate columns OB and DO with a hyphen if DO contains a value that is not NA or N/A. Otherwise, just use OB.

最佳答案

由于 Excel 不能很好地处理数据,我不得不转向 SQL。我现在已经在 SQL 中完全运行了。如果有人对解决方案感到好奇,我已将其发布在下面。

SELECT [表1].[ID]、[表1].[代码]、计数([表1].[代码]) AS [代码计数] 来自[表1] GROUP BY [表1].[ID], [表1].[代码];

我首先对 CODE 进行计数,并按 ID 和 CODE 进行分组。这可以让我计算出每个 ID 的每个代码的数量。对于上面的示例,W12-05 将列出两次,并且计数为 1 和 1,结果如下表所示。

表2

ID  CODE    CODE Count
W12-05  AA  1
W12-05  BB  1
W14-01  CC  1
W14-03  AA  1
W15-01  DD  2

然后,我对 ID 进行计数并按 ID 进行分组。

SELECT [Table1].[ID], Count([Table1].[ID]) AS [ID Count]
FROM [Table1]
GROUP BY [Table1].[ID];

表3

ID  ID Count
W12-05  2
W14-01  1
W14-03  1
W15-01  2

这将得到每个 ID 的总数。

接下来,我比较每个 ID 的 ID 计数和 CODE 计数。

SELECT [Table2].[ID], [Table2].[CODE], [Table2].[CODE Count], [Table3].[Count ID]
FROM [Table2] LEFT JOIN [Table3] ON [Table2].[ID] = [Table3].[ID];

这会产生下表。

表4

ID     CODE CODE Count  ID Count
W12-05  AA       1          2
W12-05  BB       1          2
W14-01  CC       1          1
W14-03  AA       1          1
W15-01  DD       2          2

我做的最后一步是比较 CODE 和 ID 的计数。

SELECT [Table4].[ID], [Table4].[CODE Count], [Table4].[Count ID], IIf([Table4].[CODE Count]<>[Table4].[Count ID],"ZZ", [Table4].CODE) AS CODE
FROM [Table4];

如果 CODE 计数和 ID 计数不匹配,则将其分配给“ZZ”。

表5

ID    CODE Count  ID Count  CODE
W12-05    1            2     ZZ
W12-05    1            2     ZZ
W14-01    1            1     CC
W14-03    1            1     AA
W15-01    2            2     DD

从这里,您可以只获取 DISTINCT 值。

SELECT DISTINCT [Table5].[ID], [Table5].CODE
FROM [Table5];

ID     CODE
W12-05  ZZ
W14-01  CC
W14-03  AA
W15-01  DD

我不确定这是否是最佳方式,但这对我来说是一个可行的解决方案。我希望这有帮助!

关于python - Excel 到 SQL 并处理重复值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54448831/

相关文章:

python - 使用 PyCharm 的 Google App Engine Flask 项目 - sys.path.insert、virtualenv、site-packages

mysql - 将 TEXT 列默认值从 null 更改为 ''(空字符串)

SQL 将 varchar 列转换为 float

sql - 基于多个聚合列进行透视

r - R 中按组划分的带状图

python - 如何在qlistview python中过滤文件

python - 具有抗锯齿功能的可嵌入 GUI 的 Python 绘图小部件

python - PyQt:在 Windows 中为我的程序执行技巧 "start at boot"的最佳方法

r - 使用 R 快速计算子集

r - 为什么 kmeans 找不到这 3 个簇?