提问人:KJG 提问时间:10/13/2023 最后编辑:KJG 更新时间:10/13/2023 访问量:106
仅基于多个“时间”的 SQL 选择记录
sql select record based on multiple "time" only
问:
我在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 |
到目前为止,我尝试遵循步骤是徒劳的
- 使用“SELECT DISTINCT A FROM myTable”查找不同的“A”值
- 使用“SELECT DISTINCT Time FROM myTable ORDER BY Time ASC”查找不同的“时间”值
- 对于“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
谢谢
注意:我过去的一些问题没有得到很好的回应。因此,如果我发布类似的问题,我会被阻止。如果您对这个问题有同样的感觉,请不要将其标记为错误问题。相反,不要回答这个问题。谢谢
答:
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服务器,但我想它在某个时候发生了变化。老实说,你在这里遇到的最大挑战是你试图将关系数据库用于非常非关系的概念。你的输出是非规范化的,并且对使用什么技术有很多限制,这只会让它变得更加困难。
评论