仅基于多个“时间”的 SQL 选择记录

sql select record based on multiple "time" only

提问人:KJG 提问时间:10/13/2023 最后编辑:KJG 更新时间:10/13/2023 访问量:106

问:

我在Excel中得到下表“myTable”。

时间 一个 B C
0:01:01 苹果 1 2
0:01:01 香蕉 3 4
0:01:01 樱桃 5 6
0:02:01 苹果 11 12
0:02:01 香蕉 13 14
0:02:01 樱桃 15 16
0:03:01 苹果 21 22
0:03:01 香蕉 23 24
0:03:01 樱桃 25 26

想要将其转换为

时间 一个 B C 一个 B C 一个 B C
0:01:01 苹果 1 2 香蕉 3 4 樱桃 5 6
0:02:01 苹果 11 12 香蕉 13 14 樱桃 15 16
0:03:01 苹果 21 22 香蕉 23 24 樱桃 25 26

到目前为止,我尝试遵循步骤是徒劳的

  1. 使用“SELECT DISTINCT A FROM myTable”查找不同的“A”值
  2. 使用“SELECT DISTINCT Time FROM myTable ORDER BY Time ASC”查找不同的“时间”值
  3. 对于“A”的每个值,我都试图每次获取条目 “SELECT * FROM myTable WHERE A in (”Apple“) AND Time in (”0:01:01“, ”0:02:01“, ”0:03:01“)” -> 此查询失败 我的方法,如果对于“A”的每个值,请获取表格并明智地更新 excel 工作表列。即针对所有“时间”首次查询“Apple”。在 Excel 中更新此值。第二次查询“香蕉”反对所有时间“并在Apple更新后更新

请提供任何帮助。

  • 时间列仅由“时间”组成
  • 使用 VBA 脚本在 EXCEL 中使用 ADODB 连接。我认为 ADODB 使用 MS SQL

谢谢

注意:我过去的一些问题没有得到很好的回应。因此,如果我发布类似的问题,我会被阻止。如果您对这个问题有同样的感觉,请不要将其标记为错误问题。相反,不要回答这个问题。谢谢

SQL EXCEL VBA ADODB

评论

0赞 Sean Lange 10/13/2023
你说你在Excel中有一个表,但你也说这是在sql server中。数据实际在哪里?此外,从您声称想要的内容来看,前两个查询看起来会返回您想要的内容。第三个....我不知道你想在那里做什么。转换表位也没有意义。
0赞 KJG 10/13/2023
更新了查询。在 Excel 中,我使用 ADODB 连接。希望 ADODB 使用 MS SQL。第三个查询:我将对“A”列中的每个唯一值运行,并将其并排保存在 Excel 中
1赞 Sean Lange 10/13/2023
老实说,这是一团糟。您将需要使用透视或条件聚合。但是你怎么知道苹果永远是第一位,香蕉永远是第二位,樱桃永远是第三位呢?当你添加第四个时会发生什么?第五?这并不是真正可控的。
0赞 KJG 10/13/2023
在我的第一个查询中,我会在“A”列中找到不同的值。使用这些不同的值,我一个接一个地循环。我没有具体说明不同“A”的顺序。简而言之,根据我的例子,我可以从 APPLE 或 Banana 或 cherry 开始。不具体说明顺序
0赞 Sean Lange 10/13/2023
你不想对这种事情使用循环。再次查找如何使用条件聚合或透视。这可以而且应该通过单个查询来完成。

答:

0赞 Sean Lange 10/13/2023 #1

在循环中执行此操作是错误的方法。我也会避免使用像 .它是一个数据类型名称,应该避免使用,因为它只会使事情变得更加困难。在这种情况下,它太模棱两可而没有用了。该值表示什么?时间创建?时间购买?时间更新?SomeOtherTime?此外,多次具有相同的列名也表明存在设计问题,但我会让你解决这个问题。time

下面介绍如何使用条件聚合从示例数据中检索此信息。

declare @Something table
(
    MyTime time
    , A varchar(20)
    , B int
    , C int
)
insert @Something values
('0:01:01', 'Apple', 1, 2)
, ('0:01:01', 'Banana', 3, 4)
, ('0:01:01', 'Cherry', 5, 6)
, ('0:02:01', 'Apple', 11, 12)
, ('0:02:01', 'Banana', 13, 14)
, ('0:02:01', 'Cherry', 15, 16)
, ('0:03:01', 'Apple', 21, 22)
, ('0:03:01', 'Banana', 23, 24)
, ('0:03:01', 'Cherry', 25, 26);

with MyCte as
(
    select *
        , RowNum = ROW_NUMBER() over(partition by s.MyTime order by s.B)
    from @Something s
)
select [Time] = max(c.MyTime)
    , A = max(case when c.RowNum = 1 then A end)
    , B = max(case when c.RowNum = 1 then B end)
    , C = max(case when c.RowNum = 1 then C end)
    , A = max(case when c.RowNum = 2 then A end)
    , B = max(case when c.RowNum = 2 then B end)
    , C = max(case when c.RowNum = 2 then C end)
    , A = max(case when c.RowNum = 3 then A end)
    , B = max(case when c.RowNum = 3 then B end)
    , C = max(case when c.RowNum = 3 then C end)
from MyCte c
group by c.MyTime

评论

0赞 KJG 10/15/2023
多谢。但是我在查询表达式 'ROW_NUMBER() OVER(PARTITION BY MyTime order by s.B) 中出现语法错误(缺少运算符)似乎基于 EXCEL 的 SQL 查询 stackoverflow.com/questions/48270156/ 不支持 ROW_Function() ...
0赞 Sean Lange 10/16/2023
好吧,在某一时刻,它被标记为sql服务器,但我想它在某个时候发生了变化。老实说,你在这里遇到的最大挑战是你试图将关系数据库用于非常非关系的概念。你的输出是非规范化的,并且对使用什么技术有很多限制,这只会让它变得更加困难。