【问题标题】:How do you transform a queries rows and columns你如何转换查询的行和列
【发布时间】: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   |
|-------------------------------------------------------------------|

我的第一个问题是可以改变查询来做到这一点吗?

我的第二个问题是,如果我更进一步,是否可以更改查询以删除 matlspec 行,因为它们分别包含各自列中每一行的相同数据,因此只有数据返回差异:

|-------------------------------------------------------------------|
|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   |
|---------------------------|

你能像这样删除特定列中出现重复的行吗???

【问题讨论】:

    标签: sql ms-access


    【解决方案1】:

    考虑:

    查询1:qryUNION

    SELECT cnPart, [desc] AS Data, "desc" AS Cat FROM PartData
    UNION SELECT cnPart, [qty], "qty" FROM PartData
    UNION SELECT cnPart, mnPart, "mnPart" FROM PartData
    UNION SELECT cnPart, mat1, "mat1" FROM PartData
    UNION SELECT cnPart, spec, "spec" FROM PartData;
    

    查询2:

    TRANSFORM First(qryUNON.Data) AS FirstOfData
    SELECT qryUNON.Cat
    FROM qryUNON
    GROUP BY qryUNON.Cat
    PIVOT qryUNON.cnPart;
    

    在 UNION 的每个 SELECT 中应用过滤条件。

    mat1 和 spec 可以通过在 UNION 中不包括那些 SELECT 行或通过 CROSSTAB 中的过滤器来排除。

    生成的数据集不可编辑,因此在表单上不是很有用。

    上述查询的替代方法是导出到 Excel 并使用其复制/粘贴和转置实用程序。

    【讨论】:

    • 这很好用,但我正在努力过滤 CROSSTAB 以排除重复数据。我不能从 UNION 中的 SELECT 语句中排除,因为直到我有了数据,我才能看到哪些是重复的,所以我只能以某种方式进行过滤。您将如何过滤 CROSSTAB?
    • 每个 SELECT 中可以有过滤器:WHERE ([mnPart] IN ('w1000','w1001','w1002','w1003','w1004'))。通过在 UNION 中不包括这些行来排除 mat1 和 spec。
    • 或在 CROSSTAB 中添加 WHERE:Cat IN ("qty","desc","mnPart")。使用 Access 查询设计器。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-09
    • 2011-09-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多