【发布时间】:2021-11-21 17:45:24
【问题描述】:
我不确定术语是否正确,但我想做的是转换 MS Access 查询,以便交换行和列。
我正在尝试构建一个简单的比较查询。
首先,我有一个通过以下查询选择的表:
|------------------------------------------------------|
|cnPart |qty |desc |mnPart |matl |spec |
|------------------------------------------------------|
|00001 |10 |blWidget |w1000 |s1 |a4b7c3d4 |
|00002 |20 |brWidget |w1001 |s1 |a4b7c3d4 |
|00003 |15 |gnWidget |w1002 |s1 |a4b7c3d4 |
|00004 |5 |rdWidget |w1003 |s1 |a4b7c3d4 |
|00005 |30 |vtWidget |w1004 |s1 |a4b7c3d4 |
|------------------------------------------------------|
SELECT [cnPart],[qty],[desc],[mnPart],[matl],[spec] FROM PartData WHERE ([mnPart] IN ('w1000','w1001','w1002','w1003','w1004'))
为了让它更容易呈现,我想交换行和列,这样最终的结果是这样的:
|-------------------------------------------------------------------|
|cnPart |00001 |00002 |00003 |00004 |00005 |
|qty |10 |20 |15 |5 |30 |
|desc |blWidget |brWidget |gnWidget |rdWidget |vtWidget |
|mnPart |w1000 |w1001 |w1002 |w1003 |w1004 |
|matl |s1 |s1 |s1 |s1 |s1 |
|spec |a4b7c3d4 |a4b7c3d4 |a4b7c3d4 |a4b7c3d4 |a4b7c3d4 |
|-------------------------------------------------------------------|
我的第一个问题是可以改变查询来做到这一点吗?
我的第二个问题是,如果我更进一步,是否可以更改查询以删除 matl 和 spec 行,因为它们分别包含各自列中每一行的相同数据,因此只有数据返回差异:
|-------------------------------------------------------------------|
|cnPart |00001 |00002 |00003 |00004 |00005 |
|qty |10 |20 |15 |5 |30 |
|desc |blWidget |brWidget |gnWidget |rdWidget |vtWidget |
|mnPart |w1000 |w1001 |w1002 |w1003 |w1004 |
|-------------------------------------------------------------------|
或者在打开报表或指定为子表单的来源之前,我是否必须进行一些后期处理才能实现这一点?
谢谢
编辑:提供更多细节以回应来自@June7 的 cmets
我目前的查询,基于响应和我自己的轻微修改如下:
查询1:qryUNION
SELECT *
FROM (SELECT [cnPart],[desc] as DATA,"desc" as CAT from PartData
UNION SELECT [cnPart], [qty], "qty" FROM PartData
UNION SELECT [cnPart], [matl],"matl" FROM PartData
UNION SELECT [cnPart], [spec],"spec" FROM PartData) AS A
WHERE (cnPart IN ('00001','00002','00003','00004','00005'));
提供以下输出:
|---------------------------|
|cnPart |DATA |CAT |
|---------------------------|
|00001 |10 |qty |
|00001 |a4b7c3d4 |spe |
|00001 |blWidget |desc |
|00001 |s1 |matl |
|00002 |20 |qty |
|00002 |a4b7c3d4 |spec |
|00002 |brWidget |desc |
|00002 |s1 |matl |
|00003 |15 |qty |
|00003 |a4b7c3d4 |spec |
|00003 |gnWidget |desc |
|00003 |s1 |matl |
|00004 |5 |qty |
|00004 |a4b7c3d4 |spec |
|00004 |rdWidget |desc |
|00004 |s1 |matl |
|00005 |30 |qty |
|00005 |a4b7c3d4 |spec |
|00005 |s1 |matl |
|00005 |vtWidget |desc |
|---------------------------|
我可以看到添加过滤器WHERE ([mnPart] IN ('w1000','w1001','w1002','w1003','w1004')) 或排除某些字段的逻辑,但问题是在运行查询之前我不知道哪些列包含重复信息......所以每次查询运行时,我必须手动查看重复项在哪里,编辑查询并重新运行。
从上面的qryUNION结果中,我们可以看到DATA列下有重复,那么有可能删除有重复的行吗?
那么,我们能否删除这些行,因为它们在 DATA 列下包含重复值 S1。
|---------------------------|
|cnPart |DATA |CAT |
|---------------------------|
|00001 |10 |qty |
|00001 |a4b7c3d4 |spe |
|00001 |blWidget |desc |
|00001 |s1 |matl | < REMOVE
|00002 |20 |qty |
|00002 |a4b7c3d4 |spec |
|00002 |brWidget |desc |
|00002 |s1 |matl | < REMOVE
|00003 |15 |qty |
|00003 |a4b7c3d4 |spec |
|00003 |gnWidget |desc |
|00003 |s1 |matl | < REMOVE
|00004 |5 |qty |
|00004 |a4b7c3d4 |spec |
|00004 |rdWidget |desc |
|00004 |s1 |matl | < REMOVE
|00005 |30 |qty |
|00005 |a4b7c3d4 |spec |
|00005 |s1 |matl | < REMOVE
|00005 |vtWidget |desc |
|---------------------------|
并删除这些行,因为它们在 DATA 列下包含重复值 a4b7c3d4。
|---------------------------|
|cnPart |DATA |CAT |
|---------------------------|
|00001 |10 |qty |
|00001 |a4b7c3d4 |spe | < REMOVE
|00001 |blWidget |desc |
|00001 |s1 |matl |
|00002 |20 |qty |
|00002 |a4b7c3d4 |spec | < REMOVE
|00002 |brWidget |desc |
|00002 |s1 |matl |
|00003 |15 |qty |
|00003 |a4b7c3d4 |spec | < REMOVE
|00003 |gnWidget |desc |
|00003 |s1 |matl |
|00004 |5 |qty |
|00004 |a4b7c3d4 |spec | < REMOVE
|00004 |rdWidget |desc |
|00004 |s1 |matl |
|00005 |30 |qty |
|00005 |a4b7c3d4 |spec | < REMOVE
|00005 |s1 |matl |
|00005 |vtWidget |desc |
|---------------------------|
你能像这样删除特定列中出现重复的行吗???
【问题讨论】: