在相邻列中组合SQL查询的结果

时间:2015-02-25 16:33:29

标签: sql excel ms-access

我知道以前曾经问过这个问题,但不幸的是,给出的解决方案并不适用于我。

我有几个查询(它们总共会有42个,但是让我们尝试使用此示例中的2个)查看一个表并返回具有不同条件的结果。我怎样才能简单地将结果放在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

上述每个查询都按预期工作,并返回一行44行。我想做的就是让查询以并排的列返回结果(所以我需要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

这将返回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

不起作用,因为它返回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问题:)

干杯

5 个答案:

答案 0 :(得分:1)

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

(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技巧会为每个选择一行选择一个人工RowNum。您的表必须具有唯一的ID列才能使此技巧起作用。

答案 1 :(得分:1)

退出让自己变得困难! :P SQL并不总是答案。我现在正在打自己,因为我试图用它来解决我遇到的数据问题......但在这种情况下,特别是在处理动态数量的列时; Excel数据透视表以这种方式运行良好......

在我看来,这只不过是“类别”后跟数据透视表的串联。

由于列2,3,4只是表示用户特定响应的类别...创建一个伪列以在该类别上进行转动并如下所示进行转动。

我用过'。'在我们进入多位数值时分离出值。如果需要,你可以在以后解析它。

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

然后我转向数据......瞧。

enter image description here

每个类别每个响应/用户都有自己的列,每个用户都有自己的行,现在行标题实际上与该类别绑定,而不必查找您在SQL中执行的操作...

由于存在更多组合,因此添加了更多列。缺少特定类别数据的用户只需在该行/列交叉点中获得空白。如10和3.1.1类。

删除总计,或根据需要更改它们的关系...最小/最大,总和......无论如何。

唯一可以预见的问题是,如果col2,col3,col4实际上没有相同的值....(就像一些额外的空间或某些东西......)但是因为值是数字而你'重新尝试使用case语句来过滤它们......我认为这会有用......

答案 2 :(得分:0)

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

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

如果无法定义这样的关系,SQL也无法做到! SQL用于返回数据行,其中所有列都以某种方式相互关联。如果你不能建立关系,那么没有任何SQL引擎可以弥补这种关系。

如果以某种方式,您确信44个查询中的第n行偶然会与其他第n行相关,只是因为您假设数据以有意义的方式返回,只需处理它所属的演示文稿。那不是SQL!

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

答案 3 :(得分:0)

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

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子句中尝试多个子查询,但我不确定访问是否支持。

答案 4 :(得分:0)

我怀疑这在Access中有效,但它会返回你想要的结果......

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

如果没有对column5(或者column1)中的值进行任何描述,很难推测出什么对你有用。