合并相邻列中 SQL 个查询的结果

Combining results of SQL queries in adjacent columns

我知道之前有人问过这个问题,但不幸的是,给出的解决方案对我不起作用。

我有几个查询(它们总共是 42 个,但让我们在这个例子中尝试使用 2 个)在不同条件下查看一个 Table 和 returning 结果。我怎样才能简单地将结果放在 SQL?

的相邻列中

查询是:

SELECT Column5 as Alias1 FROM Table WHERE Column2 = 1 AND Column3 = 1 AND Column4 =1

SELECT Column5 as Alias2 FROM Table WHERE Column2 = 1 AND Column3 = 1 AND Column4 =2

...(第 2、3 和 4 列中值的所有组合恰好是 42)

SELECT Column5 as Alias42 FROM Table WHERE Column2 = 7 AND Column3 = 3 AND Column4 =3

上面的每个查询都按预期工作,return一列有 44 行。我想要做的就是让查询 return 并排显示结果(所以我需要 42 列,每列 44 行)。

有什么想法吗?

我试过以下方法:

基于此:How do i combine multiple select statements in separate columns?

SELECT TMP1.Alias1,TMP2.Alias2 FROM 
(SELECT Column5 as Alias1 FROM Table WHERE Column2 = 1 AND Column3 = 1  AND Column4 =1) AS TMP1,
(SELECT Column5 as Alias2 FROM Table WHERE Column2 = 1 AND Column3 = 1  AND Column4 =2) AS TMP2

这 returns 44*44 行而不是 44。

基于此:Merge result of two sql queries in two columns

SELECT q1.Alias1, q2.Alias2
FROM (
(SELECT Column5 as Alias1 FROM Table WHERE Column2 = 1 AND Column3 = 1  AND Column4 =1) q1)
JOIN
(SELECT Column5 as Alias2 FROM Table WHERE Column2 = 1 AND Column3 = 1  AND Column4 =2) q1) q2
ON q1.Alias1 = q2.Alias2

不起作用,因为我不想在任何条件下加入表格,我只想让结果彼此相邻。另外,不编译。

同上(朋友推荐):

SELECT Table1.Column5, Table2.Column5
FROM Table AS Table1,
Table AS Table2
WHERE Column2 = 1 AND Column3 = 1  AND Column4 =1
AND   Column2 = 1 AND Column3 = 1  AND Column4 =2

不起作用,因为它 return 是 44*44 而不是 44 行(它不必要地连接表格)。

还有这个:How Do I Combine Multiple SQL Queries?是上面的组合。

为了提供一些背景信息,我正在尝试将 Excel 中的一组数据从长格式重新格式化为宽格式,以便对它们执行统计测试。所以我有点受 Excel SQL 功能(访问语法)的限制。

任何帮助将不胜感激。

编辑:

我不会将此作为答案发布,因为它没有完全解决我的问题SQL,但它正在解决我的问题。

我使用了 Jim Sosa 的解决方案并对其进行了修改,我得到了:

select
   iif([Column2]=1 AND [Column3]=1 AND [Column4]=1,Column5,null) as column1,
   iif([Column2]=1 AND [Column3]=1 AND [Column4]=2,Column5,null) as column2
... (40 more iffs)
from Table

然后我得到了我想要的,但有额外的空值。然后我摆脱那些空值,像这样:http://exceltactics.com/automatically-delete-blank-cells-organize-data/

就是这样。

谢谢大家的回复。

感谢您的评论,这不是典型的 SQL 问题 :)

干杯

您反复提到您不想加入 - 我认为这意味着实际上,您想要的第 1 列和第 2 列中的数据之间没有 没有 关系结果。

您现在为每个单独的查询获得 44 行这一令人高兴的事实并不意味着情况总是如此,而且您似乎没有办法能够确保query1 的第 26 行与 query2 的第 26 行有 任何关系

如果无法定义这样的关系,SQL也无法定义! SQL 用于 return 行数据,其中所有列都以某种方式彼此 相关。如果你不能给出一个关系,没有SQL引擎可以弥补那个关系。

如果不知何故,您确信 44 个查询中的第 n 行偶然与其他第 n 行相关,只是因为您假设数据以有意义的方式 returned,只需处理您的演示文稿它属于哪里。那不在 SQL!

注意:如果您 有办法定义各行之间的关系,则应在查询中指出。然后您可以编写一个(丑陋的)查询来组合所有内容 - 但您的应用程序更有可能更好地处理这件事!

我已经很长时间没有使用访问权限了,但我相信有几种方法可以做到这一点。虽然其中一个更有趣的是:

select Max(iif(Column2 = 1 AND Column3 = 1 AND Column4 =1, column5, 0)) as column1,
       Max(iif(Column2 = 1 AND Column3 = 1 AND Column4 =2, column5, 0)) as column2,
       ...
       Max(iif(Column2 = 7 AND Column3 = 3 AND Column4 =4, column5, 0)) as column42
  from table

我在这里假设 column5 是一个正数,尽管它可能有效,即使它是一个字符串。如果不是,您可能必须将 0 更改为空字符串或类似的字符串。聚合函数将确保您只返回一行。您也可以在 select 子句中尝试多个子查询,但我不确定访问是否支持。

您的第二个解决方案基于加入,非常接近。您需要更改它以加入人工行号,如下所示:

(SELECT
    (SELECT COUNT(*) FROM Table t WHERE t.Id < tt.Id) AS RowNum
,   Column5 as Alias1
FROM Table tt
WHERE Column2 = 1 AND Column3 = 1  AND Column4 =1) AS q1

    JOIN

(SELECT
    (SELECT COUNT(*) FROM Table q WHERE q.Id < qq.Id) AS RowNum
,   Column5 as Alias2
FROM Table qq
WHERE Column2 = 1 AND Column3 = 1  AND Column4 =1) AS q2

    ON q1.RowNum = q2.RowNum

(SELECT COUNT(*) FROM Table q WHERE q.Id < qq.Id) as RowNum 技巧为每个 select 的每一行分配一个人工 RowNum。您的表必须有一个唯一的 ID 列才能使这个技巧起作用。

别再给自己添麻烦了! :P SQL 并不总是答案。我现在正在打击自己,因为我试图用它来解决我 运行 遇到的数据问题……但在这种情况下,尤其是在处理动态列数时; Excel pivot table 以这种方式工作得很好...

在我看来,这只不过是 "Categories" 后跟一个枢轴 table 的串联。

由于第 2、3、4 列只是一个表示用户特定响应的类别...创建一个伪列以该类别为基础并按如下方式进行调整。

我用了一个'.'将值分开,以防我们进入 multi-digit 值。如果需要,您可以稍后将其解析出来。

在 Col F 中,我所做的只是连接列 b、c、d 给我一个唯一值作为列 header,这对每个用户都是相同的 (col1)

然后我以数据为中心......瞧。

每个类别每个 response/user 都有自己的列,每个用户都有自己的行,现在行 header 实际上与类别相关联,而无需去查找您在 SQL...

随着存在更多组合,将添加更多列。用户缺少特定类别的数据,只需在 row/column 交叉点得到一个空白。比如10和类别3.1.1.

删除总计,或根据需要更改它们之间的关系...Min/Max,求和...随心所欲。

我能预见的唯一问题是,如果 col2、col3、col4 实际上没有相同的值....(比如额外的 space 或某些...)但是作为值是数字,您正在尝试使用 case 语句来过滤它们...我认为这会起作用...

我怀疑这在 Access 中是否有效,但它会 return 您寻求的结果...

with T as (
    select
        column2, column3, column4, column5,
        row_number() over (
            partition by column2, column3, column4
            order by column5 /* ?? or possibly (select 1) for a random ordering of rows */
        ) as rownum
    from <yourtable>
)
select
    min(case when column2 = 1 and column3 = 1 and column4 = 1 then column5 end),
    min(case when column2 = 1 and column3 = 1 and column4 = 2 then column5 end),
    min(case when column2 = 1 and column3 = 1 and column4 = 3 then column5 end),
    min(case when column2 = 1 and column3 = 2 and column4 = 1 then column5 end),
    min(case when column2 = 1 and column3 = 2 and column4 = 2 then column5 end),
    min(case when column2 = 1 and column3 = 2 and column4 = 3 then column5 end),
    min(case when column2 = 1 and column3 = 3 and column4 = 1 then column5 end),
    min(case when column2 = 1 and column3 = 3 and column4 = 2 then column5 end),
    min(case when column2 = 1 and column3 = 3 and column4 = 3 then column5 end),
    ...
    min(case when column2 = 7 and column3 = 1 and column4 = 1 then column5 end),
    min(case when column2 = 7 and column3 = 1 and column4 = 2 then column5 end),
    min(case when column2 = 7 and column3 = 1 and column4 = 3 then column5 end),
    min(case when column2 = 7 and column3 = 2 and column4 = 1 then column5 end),
    min(case when column2 = 7 and column3 = 2 and column4 = 2 then column5 end),
    min(case when column2 = 7 and column3 = 2 and column4 = 3 then column5 end),
    min(case when column2 = 7 and column3 = 3 and column4 = 1 then column5 end),
    min(case when column2 = 7 and column3 = 3 and column4 = 2 then column5 end),
    min(case when column2 = 7 and column3 = 3 and column4 = 3 then column5 end)
from T
group by rownum

也许 Access 更喜欢这个??

select
    min(case when column2 = 1 and column3 = 1 and column4 = 1 then column5 end),
    min(case when column2 = 1 and column3 = 1 and column4 = 2 then column5 end),
    min(case when column2 = 1 and column3 = 1 and column4 = 3 then column5 end),
    min(case when column2 = 1 and column3 = 2 and column4 = 1 then column5 end),
    min(case when column2 = 1 and column3 = 2 and column4 = 2 then column5 end),
    min(case when column2 = 1 and column3 = 2 and column4 = 3 then column5 end),
    min(case when column2 = 1 and column3 = 3 and column4 = 1 then column5 end),
    min(case when column2 = 1 and column3 = 3 and column4 = 2 then column5 end),
    min(case when column2 = 1 and column3 = 3 and column4 = 3 then column5 end),
    ...
    min(case when column2 = 7 and column3 = 1 and column4 = 1 then column5 end),
    min(case when column2 = 7 and column3 = 1 and column4 = 2 then column5 end),
    min(case when column2 = 7 and column3 = 1 and column4 = 3 then column5 end),
    min(case when column2 = 7 and column3 = 2 and column4 = 1 then column5 end),
    min(case when column2 = 7 and column3 = 2 and column4 = 2 then column5 end),
    min(case when column2 = 7 and column3 = 2 and column4 = 3 then column5 end),
    min(case when column2 = 7 and column3 = 3 and column4 = 1 then column5 end),
    min(case when column2 = 7 and column3 = 3 and column4 = 2 then column5 end),
    min(case when column2 = 7 and column3 = 3 and column4 = 3 then column5 end)
from
    (
    select
        column2, column3, column4, column5,
        (
        select count(*)
        from <yourtable> as t2
        where t2.column2 = t1.column2 and t2.column3 = t2.column3 and t2.column4 = t1.column4
            and t2.column5 < t1.column5 /* need some way to break ties */
        ) as rownum
    from <yourtable> as t1
    ) as T
group by rownum

如果没有对第 5 列(或第 1 列)中值的任何描述,很难推测什么对您有用。