- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有下表:
create table myorders(ordertype char(1), orderdate datetime, orderid int)
该表包含以下数据:
insert into myorders(ordertype, orderdate, orderid) values('P', '2013-02-14 20:04:48:287', 11082360)
insert into myorders(ordertype, orderdate, orderid) values('P', '2013-02-14 20:02:40:407', 40087130)
insert into myorders(ordertype, orderdate, orderid) values('P', '2013-02-14 20:02:07:277', 7990558)
insert into myorders(ordertype, orderdate, orderid) values('C', '2013-02-14 19:58:46:097', 8225181)
insert into myorders(ordertype, orderdate, orderid) values('P', '2013-02-14 19:58:39:740', 40087129)
insert into myorders(ordertype, orderdate, orderid) values('C', '2013-02-14 19:57:33:063', 8225235)
insert into myorders(ordertype, orderdate, orderid) values('C', '2013-02-14 19:56:17:207', 8225233)
insert into myorders(ordertype, orderdate, orderid) values('C', '2013-02-14 19:54:50:630', 8225232)
insert into myorders(ordertype, orderdate, orderid) values('P', '2013-02-14 19:48:07:300', 11082337)
insert into myorders(ordertype, orderdate, orderid) values('P', '2013-02-14 19:47:49:997', 40087128)
insert into myorders(ordertype, orderdate, orderid) values('P', '2013-02-14 19:46:40:667', 40087127)
insert into myorders(ordertype, orderdate, orderid) values('C', '2013-02-14 19:45:32:550', 8225231)
insert into myorders(ordertype, orderdate, orderid) values('P', '2013-02-14 19:45:11:203', 11082326)
insert into myorders(ordertype, orderdate, orderid) values('C', '2013-02-14 19:44:57:990', 8225230)
insert into myorders(ordertype, orderdate, orderid) values('P', '2013-02-14 19:43:52:953', 40087126)
insert into myorders(ordertype, orderdate, orderid) values('C', '2013-02-14 19:43:20:853', 8225229)
insert into myorders(ordertype, orderdate, orderid) values('P', '2013-02-14 19:41:33:740', 11082319)
insert into myorders(ordertype, orderdate, orderid) values('C', '2013-02-14 19:41:19:853', 8225228)
insert into myorders(ordertype, orderdate, orderid) values('P', '2013-02-14 19:40:33:127', 40087125)
insert into myorders(ordertype, orderdate, orderid) values('P', '2013-02-14 19:40:25:537', 40087124)
数据如下所示:
OrderType OrderDate OrderId
-------- ----------------------- ---------
P 2013-02-14 20:04:48.287 11082360
P 2013-02-14 20:02:40.407 40087130
P 2013-02-14 20:02:07.277 7990558
C 2013-02-14 19:58:46.097 8225181
P 2013-02-14 19:58:39.740 40087129
C 2013-02-14 19:57:33.063 8225235
C 2013-02-14 19:56:17.207 8225233
C 2013-02-14 19:54:50.630 8225232
P 2013-02-14 19:48:07.300 11082337
P 2013-02-14 19:47:49.997 40087128
P 2013-02-14 19:46:40.667 40087127
C 2013-02-14 19:45:32.550 8225231
P 2013-02-14 19:45:11.203 11082326
C 2013-02-14 19:44:57.990 8225230
P 2013-02-14 19:43:52.953 40087126
C 2013-02-14 19:43:20.853 8225229
P 2013-02-14 19:41:33.740 11082319
C 2013-02-14 19:41:19.853 8225228
P 2013-02-14 19:40:33.127 40087125
P 2013-02-14 19:40:25.537 40087124
我想旋转数据,使其看起来像这样:
C_LastFiveOrders C_OrderDate P_LastFiveOrders P_OrderDate
---------------- ----------------------- ---------------- -----------------------
8225181 2013-02-14 19:58:46.097 11082360 2013-02-14 20:04:48.287
8225235 2013-02-14 19:57:33.063 40087130 2013-02-14 20:02:40.407
8225233 2013-02-14 19:56:17.207 7990558 2013-02-14 20:02:07.277
8225232 2013-02-14 19:54:50.630 40087129 2013-02-14 19:58:39.740
8225231 2013-02-14 19:45:32.550 11082337 2013-02-14 19:48:07.300
请注意,订单是按订单日期降序排列的。
我希望能够添加其他订单类型。我还希望能够灵活地查看最后 x 个订单。在示例中,我查看的是最后五个订单。我希望能够查看最近 10 或 20 个订单。
最佳答案
可以通过多种不同的方式来执行此操作。
使用 CASE 聚合:您可以将聚合函数与 CASE
表达式结合使用:
select
max(case when ordertype = 'c' then orderid end) C_LASTFIVEORDERS,
max(case when ordertype = 'c' then orderdate end) C_ORDERDATE,
max(case when ordertype = 'p' then orderid end) P_LASTFIVEORDERS,
max(case when ordertype = 'p' then orderdate end) P_ORDERDATE
from
(
select orderid, ordertype, orderdate, rn
from
(
select orderid, ordertype, orderdate,
row_number() over(partition by ordertype
order by orderdate desc) rn
from myorders
) src
where rn <=5
) s
group by rn
多次联接:您可以多次联接表:
;with cte as
(
select orderid, ordertype, orderdate,
row_number() over(partition by ordertype
order by orderdate desc) rn
from myorders
)
select
c1.orderid C_LASTFIVEORDERS,
c1.orderdate C_ORDERDATE,
c2.orderid P_LASTFIVEORDERS,
c2.orderdate P_ORDERDATE
from cte c1
left join cte c2
on c1.rn = c2.rn
and c2.ordertype = 'P'
where c1.rn <=5
and c1.ordertype = 'C'
静态枢轴:
最后,您可以同时应用 UNPIVOT
和 PIVOT
函数获取结果:
select C_LastFiveOrders, C_orderdate,
P_LastFiveOrders, P_orderdate
from
(
select rn,
case
when col = 'orderid' then ordertype+'_LastFiveOrders'
else ordertype+'_'+col end col_name,
value
from
(
select ordertype,
convert(varchar(50), orderdate, 121) orderdate,
cast(orderid as varchar(50)) orderid,
row_number() over(partition by ordertype
order by orderdate desc) rn
from myorders
)src
unpivot
(
value
for col in (orderdate, orderid)
) un
where rn <= 5
) s
pivot
(
max(value)
for col_name in (C_LastFiveOrders, C_orderdate,
P_LastFiveOrders, P_orderdate)
) piv
动态枢轴:
如果您的 OrderType
值未知,那么您可以使用动态 SQL:
DECLARE @cols AS NVARCHAR(MAX),
@colsName AS NVARCHAR(MAX),
@query AS NVARCHAR(MAX)
select @cols = STUFF((SELECT distinct ',' + QUOTENAME(ordertype +c.col)
from myorders
cross apply
(
select '_LastFiveOrders' col
union all
select '_OrderDate'
) c
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)')
,1,1,'')
set @query
= 'SELECT ' + @cols + '
from
(
select rn,
case
when col = ''orderid'' then ordertype+''_LastFiveOrders''
else ordertype+''_''+col end col_name,
value
from
(
select ordertype,
convert(varchar(50), orderdate, 121) orderdate,
cast(orderid as varchar(50)) orderid,
row_number() over(partition by ordertype
order by orderdate desc) rn
from myorders
)src
unpivot
(
value
for col in (orderdate, orderid)
) un
where rn <= 5
) s
pivot
(
max(value)
for col_name in (' + @cols + ')
) p
'
execute(@query)
所有查询都会给出结果:
| C_LASTFIVEORDERS | C_ORDERDATE | P_LASTFIVEORDERS | P_ORDERDATE |
-------------------------------------------------------------------------------------------
| 8225181 | 2013-02-14 19:58:46.097 | 11082360 | 2013-02-14 20:04:48.287 |
| 8225235 | 2013-02-14 19:57:33.063 | 40087130 | 2013-02-14 20:02:40.407 |
| 8225233 | 2013-02-14 19:56:17.207 | 7990558 | 2013-02-14 20:02:07.277 |
| 8225232 | 2013-02-14 19:54:50.630 | 40087129 | 2013-02-14 19:58:39.740 |
| 8225231 | 2013-02-14 19:45:32.550 | 11082337 | 2013-02-14 19:48:07.300 |
关于sql-server - SQL Server Pivots...我可以显示一系列订单类型的最后五个订单吗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14883465/
SQL、PL-SQL 和 T-SQL 之间有什么区别? 谁能解释一下这三者之间的区别,并提供每一个的相关使用场景? 最佳答案 SQL 是一种对集合进行操作的查询语言。 它或多或少是标准化的,几乎所有关
这个问题已经有答案了: What is the difference between SQL, PL-SQL and T-SQL? (6 个回答) 已关闭 9 年前。 我对 SQL 的了解足以完成我的
我在数据库中有一个 USER 表。该表有一个 RegistrationDate 列,该列有一个默认约束为 GETDATE()。 使用 LINQ 时,我没有为 RegistrationDate 列提供任
我有一个可能属于以下类型的字符串 string expected result 15-th-rp 15 15/12-rp 12 15-12-th
很难说出这里问的是什么。这个问题模棱两可、含糊不清、不完整、过于宽泛或言辞激烈,无法以目前的形式合理回答。如需帮助澄清此问题以便可以重新打开,visit the help center . 9年前关闭
我有一个存储过程(称为 sprocGetArticles),它从文章表中返回文章列表。这个存储过程没有任何参数。 用户可以对每篇文章发表评论,我将这些评论存储在由文章 ID 链接的评论表中。 有什么方
我目前正在做一个 *cough*Oracle*cough* 数据库主题。讲师介绍embedded SQL作为让其他语言(例如 C、C++)与(Oracle)数据库交互的方式。 我自己做了一些数据库工作
SQL Server 中 SQL 语句的最大长度是多少?这个长度是否取决于 SQL Server 的版本? 例如,在 DECLARE @SQLStatement NVARCHAR(MAX) = N'S
这个问题已经有答案了: Simple way to transpose columns and rows in SQL? (9 个回答) 已关闭 8 年前。 CallType
预先感谢您对此提供的任何帮助。 假设我有一个查询,可以比较跨年的数据,从某个任意年份开始,永无止境(进入 future ),每年同一时期直到最后一个完整的月份(其特点是一月数据永远不会显示至 2 月
我在数据库中有一个 USER 表。该表有一个 RegistrationDate 列,该列的默认约束为 GETDATE()。 使用 LINQ 时,我没有为 RegistrationDate 列提供任何数
下面是我试图用来检查存储过程是否不存在然后创建过程的 sql。它会抛出一个错误:Incorrect syntax near the keyword 'PROCEDURE' IF NOT EXISTS
我有一个同事声称动态 SQL 在许多情况下比静态 SQL 执行得更快,所以我经常看到 DSQL 到处都是。除了明显的缺点,比如在运行之前无法检测到错误并且更难阅读,这是否准确?当我问他为什么一直使用
来自 lobodava 的动态 SQL 查询是: declare @sql nvarchar(4000) = N';with cteColumnts (ORDINAL_POSITION, CO
使用 SQL Server 中的存储过程执行动态 SQL 命令的现实优点和缺点是什么 EXEC (@SQL) 对比 EXEC SP_EXECUTESQL @SQL ? 最佳答案 sp_executes
我有这个有效的 SQL 查询: select sum(dbos.Points) as Points, dboseasons.Year from dbo.StatLines dbos i
我正在调试一些构建成功运行的 SQL 命令的代码。 然而,在查询结束时,查询结果似乎被写入了一个文本文件。 完整的查询如下 echo SELECT DATE,DATETABLE,DATE,APPDAT
我有一些创建表的 .sql 文件(MS SQL 数据库): 表_1.sql: IF OBJECT_ID (N'my_schema.table1', N'U') IS NOT NULL DROP TAB
我写了下面的 SQL 存储过程,它一直给我错误@pid = SELECT MAX(... 整个过程是: Alter PROCEDURE insert_partyco @pname varchar(20
我在 SQL Server 2005 中有包含两列 Fruit 和 Color 的表,如下所示 Fruit Colour Apple Red Orange
我是一名优秀的程序员,十分优秀!