我有一个 SQL Server 实例,它具有到 Oracle 服务器的链接服务器。Oracle 服务器上有一个名为的表,PersonOptions其中包含以下数据:
???????????????????????
? PersonID ? OptionID ?
???????????????????????
? 1 ? A ?
? 1 ? B ?
? 2 ? C ?
? 3 ? B ?
? 4 ? A ?
? 4 ? C ?
???????????????????????
Run Code Online (Sandbox Code Playgroud)
我需要对这些数据进行透视,因此结果是:
????????????????????????????????????????????
? PersonID ? OptionA ? Option B ? Option C ?
????????????????????????????????????????????
? 1 ? 1 ? 1 ? ?
? 2 ? ? ? 1 ?
? 3 ? ? …Run Code Online (Sandbox Code Playgroud) 给定两个带有名称和值的未定义行数的表,我将如何显示CROSS JOIN函数对其值的透视。
CREATE TEMP TABLE foo AS
SELECT x::text AS name, x::int
FROM generate_series(1,10) AS t(x);
CREATE TEMP TABLE bar AS
SELECT x::text AS name, x::int
FROM generate_series(1,5) AS t(x);
Run Code Online (Sandbox Code Playgroud)
例如,如果该函数是乘法,我将如何生成如下所示的(乘法)表,
所有这些(arg1,arg2,result)行都可以用
SELECT foo.name AS arg1, bar.name AS arg2, foo.x*bar.x AS result
FROM foo
CROSS JOIN bar;
Run Code Online (Sandbox Code Playgroud)
所以这只是一个演示问题,我希望这也适用于自定义名称——该名称不仅仅是CAST文本的参数,而是设置在表格中,
CREATE TEMP TABLE foo AS
SELECT chr(x+64) AS name, x::int
FROM generate_series(1,10) AS t(x);
CREATE TEMP TABLE bar AS
SELECT …Run Code Online (Sandbox Code Playgroud) 每次我决定构建一个立方体时,我都会遇到一个问题,但我还没有找到克服它的方法。
问题是如何允许用户自动定义一系列事物,而无需在维度中对它们进行硬编码。我将在一个例子中解释我的问题。
我有一个叫做客户的表:

这是表中的数据:

我想以枢轴样式显示数据,并将工资和年龄分组在定义的范围内,如下所示:

我写了这个脚本并定义了范围:
SELECT [CustId]
,[CustName]
,[Age]
,[Salary]
,[SalaryRange] = case
when cast(salary as float) <= 500 then
'0 - 500'
when cast(salary as float) between 501 and 1000 then
'501 - 1000'
when cast(salary as float) between 1001 and 2000 then
'1001 - 2000'
when cast(salary as float) > 2000 then
'2001+'
end,
[AgeRange] = case
when cast(age as float) < 15 then
'below 15'
when cast(age as float) between …Run Code Online (Sandbox Code Playgroud) 表#01 Status:
StatusID Status
-----------------------
1 Opened
2 Closed
3 ReOpened
4 Pending
Run Code Online (Sandbox Code Playgroud)
表#02 Claims:
ClaimID CompanyName StatusID
--------------------------------------
1 ABC 1
2 ABC 1
3 ABC 2
4 ABC 4
5 XYZ 1
6 XYZ 1
Run Code Online (Sandbox Code Playgroud)
预期结果:
CompanyName TotalOpenClaims TotalClosedClaims TotalReOpenedClaims TotalPendingClaims
--------------------------------------------------------------------------------
ABC 2 1 0 1
XYZ 2 0 0 0
Run Code Online (Sandbox Code Playgroud)
我需要如何编写查询才能按预期获得结果?
假设我有表 A:BookingsPerPerson
Person_Id ArrivalDate DepartureDate
123456 2012-01-01 2012-01-04
213415 2012-01-02 2012-01-07
Run Code Online (Sandbox Code Playgroud)
我需要通过视图实现以下目标:
Person_Id ArrivalDate DepartureDate Jan-01 Jan-02 Jan-03 Jan-04 Jan-05 Jan-06 Jan-07
123456 2012-01-01 2012-01-04 1 1 1 1
213415 2012-01-02 2012-01-07 1 1 1 1 1 1
Run Code Online (Sandbox Code Playgroud)
该系统用于活动,因此每次酒店预订可能需要 1 到 15 天的时间,但不会超过此时间。任何想法将不胜感激。
我有一个具有以下结构的表:
CREATE TABLE [dbo].[AUDIT_SCHEMA_VERSION](
[SCHEMA_VER_MAJOR] [int] NOT NULL,
[SCHEMA_VER_MINOR] [int] NOT NULL,
[SCHEMA_VER_SUB] [int] NOT NULL,
[SCHEMA_VER_DATE] [datetime] NOT NULL,
[SCHEMA_VER_REMARK] [varchar](250) NULL
);
Run Code Online (Sandbox Code Playgroud)
一些示例数据(似乎 sqlfiddle 有问题.. 所以放一些示例数据):
INSERT INTO [AUDIT_SCHEMA_VERSION]([SCHEMA_VER_MAJOR],[SCHEMA_VER_MINOR],[SCHEMA_VER_SUB],[SCHEMA_VER_DATE],[SCHEMA_VER_REMARK])
VALUES(1,6,13,CAST('20130405 04:41:25.000' as DATETIME),'Stored procedure build')
INSERT INTO [AUDIT_SCHEMA_VERSION]([SCHEMA_VER_MAJOR],[SCHEMA_VER_MINOR],[SCHEMA_VER_SUB],[SCHEMA_VER_DATE],[SCHEMA_VER_REMARK])
VALUES(1,6,13,CAST('20130405 04:41:25.000' as DATETIME),'Stored procedure build')
INSERT INTO [AUDIT_SCHEMA_VERSION]([SCHEMA_VER_MAJOR],[SCHEMA_VER_MINOR],[SCHEMA_VER_SUB],[SCHEMA_VER_DATE],[SCHEMA_VER_REMARK])
VALUES(1,7,13,CAST('20130405 04:41:25.000' as DATETIME),'Stored procedure build')
INSERT INTO [AUDIT_SCHEMA_VERSION]([SCHEMA_VER_MAJOR],[SCHEMA_VER_MINOR],[SCHEMA_VER_SUB],[SCHEMA_VER_DATE],[SCHEMA_VER_REMARK])
VALUES(1,10,13,CAST('20130405 04:41:25.000' as DATETIME),'Stored procedure build')
INSERT INTO [AUDIT_SCHEMA_VERSION]([SCHEMA_VER_MAJOR],[SCHEMA_VER_MINOR],[SCHEMA_VER_SUB],[SCHEMA_VER_DATE],[SCHEMA_VER_REMARK])
VALUES(1,12,13,CAST('20130405 04:41:25.000' as DATETIME),'Stored procedure build')
INSERT INTO [AUDIT_SCHEMA_VERSION]([SCHEMA_VER_MAJOR],[SCHEMA_VER_MINOR],[SCHEMA_VER_SUB],[SCHEMA_VER_DATE],[SCHEMA_VER_REMARK])
VALUES(1,12,13,CAST('20130405 04:41:25.000' as DATETIME),'Stored …Run Code Online (Sandbox Code Playgroud) 我正在使用Bluefeet 的这个很好的例子https://dba.stackexchange.com/a/25818/113298,来创建一个数据透视表并将其转换为 xml 数据。
声明参数
DECLARE @cols AS NVARCHAR(MAX), @query AS NVARCHAR(MAX);
Run Code Online (Sandbox Code Playgroud)
接下来有一个代码很多的CTE,CTE的最终结果放在一个临时数据库中(与示例中相同)
SELECT
B.[StayDate] -- this is a date dd-mm-yyyy
, B.[Guid]
INTO #tempDates
FROM BaseSelection B
Run Code Online (Sandbox Code Playgroud)
生成 cols(与示例相同)
SELECT @cols = STUFF((SELECT distinct ',' +QUOTENAME(convert(char(10), [StayDate] , 120))
FROM #tempDates
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)')
,1,1,'');
Run Code Online (Sandbox Code Playgroud)
结果集是我应该期望的
set @query =
'SELECT [Guid],' + @cols +'
FROM
(
SELECT
[StayDate]
,[Guid]
FROM #tempDates
) A
pivot
(
count([StayDate])
for [StayDate] in (' + @cols +')
) …Run Code Online (Sandbox Code Playgroud) 有两种类型的方法来执行PIVOT. 在 SQL Server 2005PIVOT推出之前,大多数人都是这样做的:
SELECT RateID
SUM(CASE WHEN RateItemTypeID = 1 THEN UnitPrice ELSE 0 END),
SUM(CASE WHEN RateItemTypeID = 2 THEN UnitPrice ELSE 0 END),
SUM(CASE WHEN RateItemTypeID = 3 THEN UnitPrice ELSE 0 END)
FROM rate_item WHERE _WhereClause_
GROUP BY RateID
Run Code Online (Sandbox Code Playgroud)
后来,当 2005 年推出时,PIVOT它变成了这样:
SELECT RateID, [1], [2], [3]
FROM PertinentRates -- PertinentRates is a CTE with WHERE clause applied
PIVOT (SUM(UnitPrice) FOR RateItemTypeID IN ([1], [2], [3])) PVT)
Run Code Online (Sandbox Code Playgroud)
在 SQL …
是否可以按表中的元素(如COLUMN LIKE='Value%')进行分组PIVOT?我有一个表 [DBT].[Status],其中包含各种状态(数据库、实例等),并且不想将所有 PROD 和 TEST 值作为单个值进行透视/查询,而是将它们分组。
例如代替具有用于状态列Prod,Prod ACC,Prod APP,...等。我将仅有一个包含的值列Name LIKE 'Prod%'和Name LIKE 'Test%'。
到目前为止我所拥有的:
CREATE TABLE [DBT].[Status](
[ID] [int] IDENTITY(1,1) NOT NULL,
[Name] [nvarchar](50) NOT NULL,
CONSTRAINT [PK_Status] PRIMARY KEY CLUSTERED
(
[ID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, FILLFACTOR = 80) ON [PRIMARY],
CONSTRAINT [IX_Status] UNIQUE NONCLUSTERED
(
[Name] ASC
)WITH (PAD_INDEX …Run Code Online (Sandbox Code Playgroud) pivot ×10
sql-server ×7
dynamic-sql ×1
mysql ×1
oracle ×1
oracle-11g ×1
performance ×1
postgresql ×1
ssas ×1
t-sql ×1
xml ×1