【问题标题】:SQL Query: New columns for data with some matching criteriaSQL 查询:具有某些匹配条件的数据的新列
【发布时间】:2020-12-02 16:57:37
【问题描述】:

我正在处理一个从表中提取数据并以类似于以下方式排列数据的查询:

Query1

BldID  UnitID   Res1

1      201      John Smith   
1      201      Jane Doe
1      202      Daniel Jones
1      202      Mark Garcia
2      201      Maria Lee
2      201      Paul Williams
2      201      Mike Jones

我想修改 SQL/Design 中的查询输出,以便共享建筑物/单元的每个居民在同一行显示为新列,如下所示:

BldID  UnitID   Res1          Res2           Res3 
1      201      John Smith    Jane Doe
1      202      Daniel Jones  Mark Garcia
2      201      Maria Lee     Paul Williams  Mike Jones    

如果这是粗略的/没有足够的信息,我深表歉意,但我们将不胜感激。

【问题讨论】:

    标签: sql ms-access multiple-columns


    【解决方案1】:

    您可以尝试使用conditional aggregation

    with cte as
    (
    select *, row_number() over(partition by BldID,UnitID order by Res1) as rn
    from tablename
    )
    
    select BldID,UnitID,
           max(case when rn=1 then Res1 end) as Res1,
           max(case when rn=2 then Res1 end) as Res2,
           max(case when rn=3 then Res1 end) as Res3
    from cte
    group by BldID,UnitID
    

    【讨论】:

    • 感谢您的回答@Fahmi。我想我应该详细说明一下。 Resident 字段本质上是所有唯一条目。每个居民都有不同的名字。这会影响结果吗?如果会,我将使用什么来选择独特的个体以达到相同的结果?
    • @llOmni,您能否修改您的示例以表明这种独特性,并更好地表达所需的内容?在这两种情况下,以这种方式从 MSAcess 获取可靠的动态列可能会涉及比您习惯的更多的运算符,并且可能会使用子查询来获取正确的结果。
    • @JaazCole 我很抱歉,因为它一开始就没有以这种方式格式化。我以我正在寻找的输出格式删除了带有一些股票名称的通用 A、B、C 标识符。就澄清声明而言,我能补充的是,每个建筑物/单元都是一个独特的实体,每个实体都有多个居民。 1/1 1/2 1/3、2/1/ 2/2 2/3,我正在尝试将这些居民隔开,因为现在他们都列在 Res1 下。再次感谢您的帮助。
    • @llOmni,我已经更新了 asnwer - 你现在可以试一试
    • @JaazCole 和 Fahmi 我一直在尝试这两个答案,但到目前为止没有运气。这可能是我的终点,因为我还是 SQL 的新手。 Faami 在输入您的数据时遇到了无效的 SQL 语句。它似乎不喜欢关于 CTE 结构的东西。 JaazCole 老实说,你在这个问题上超出了我的想象。 T1 的表名和 T2 的表名是关于哪些表的?即使我从原始查询中提取,我应该将其替换为 T1 和 T2 表,还是应该从原始表中提取并从中查询?再次感谢您的帮助。
    【解决方案2】:

    因此,从几个不同的来源中提取,这可能会起作用,尝试将其粘贴到查询编辑器中,看看它是否会运行。

    TRANSFORM MAX(Res1)
    SELECT BldID, UnitID
        , (
             SELECT COUNT(T1.Marks)
             FROM tableName AS T1
             WHERE 
                 T1.BldgID = T2.BldgID AND
                 T1.UnitID = T2.UnitID AND
                 T1.Res1 >= T2.Res1
          ) AS Rank, Res1
    FROM tableName t2
    GROUP BY BldID, UnitID
    PIVOT Rank; 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-02-12
      • 1970-01-01
      • 2022-01-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多