SQL服务器:如何形成交叉表
SQL Server: how to form a crosstab
我正在使用 SQL Server 2014。
How can I create a cross-table out of the straight table like the below?
代码 here 我在其中尝试进行多轴旋转。
示例输入
Code here only about the sample data.
其他列对列进行旋转和重新格式化后的目标
这个逻辑适合你:
创建一个额外的临时文件 table,您可以在其中存储 Store
和 City
的所有可能组合,然后与现有的 table 左连接。
从此左联接中,您将获得将用作列名称的 "calculated" 字符串(C1_L_xCount
、C1_L2_xCount
等)。
然后如下应用一个枢轴:
select ylabel.colx, ylabel.coly, y.myid, y.week, isnull(y.xCount, 0) xCount, isnull(y.yCount, 0) yCount
into #table
from (
select distinct y3.week, y1.city, y2.store, y1.city + '_' + y2.store + '_xCount' as colx, y1.city + '_' + y2.store + '_yCount' as coly
from #yt y1 cross join #yt y2 cross join #yt y3
) ylabel left join #yt y on y.week = ylabel.week and y.store = ylabel.store and y.city = ylabel.city
select * from #table --this is the additional table, the one used for pivoting
--this is your solution:
select myid
, week
, isnull(C1_L_xCount, 9) C1_L_xCount
, isnull(C1_L2_xCount, 9 ) C1_L2_xCount
, isnull(C2_L_xCount, 0) C2_L_xCount
, isnull(C2_L2_xCount, 0) C2_L2_xCount
, isnull(C1_L_yCount, 0) C1_L_yCount
, isnull(C1_L2_yCount, 0) C1_L2_yCount
, isnull(C2_L_yCount, 0) C2_L_yCount
, isnull(C2_L2_yCount, 0) C2_L2_yCount
from
(
select *
from #table
pivot ( max(xCount) for colx in ( [C1_L_xCount], [C1_L2_xCount],[C2_L_xCount], [C2_L2_xCount])) p
pivot ( max(yCount) for coly in ( [C1_L_yCount], [C1_L2_yCount],[C2_L_yCount], [C2_L2_yCount])) q
where myid is not null
) t
请检查工作演示 here。
但是,如果您需要动态添加商店和城市,则需要将其转换为 dynamic pivot。
我们重复这种情况
CASE WHEN
[City]='C1' AND [Store]='L'
THEN
[xCount]
END
AS 'LC1_xCount',
我稍微更改了估值以获得更多组合,代码 here。
或在此处输入代码:
CREATE TABLE #yt
([MyID] int, [Store] nvarchar(300), [City] nvarchar(300), [Week] int, [xCount] int, [yCount] int)
;
INSERT INTO #yt
([MyID], [Store], [City], [Week], [xCount], [yCount])
VALUES
(1, 'L', 'C1', 1, 96, 7),
(2, 'L', 'C1', 1, 138, 77),
(3, 'L2', 'C1', 1, 37, 744),
(4, 'L', 'C1', 1, 59, 74),
(5, 'L', 'C1', 2, 282,73333),
(6, 'L2', 'C2', 2, 212,7333),
(7, 'L2', 'C2', 2, 78,733),
(8, 'L', 'C2', 2, 97,73),
(9, 'L', 'C2', 3, 60,72222),
(10, 'L2', 'C2', 3, 123,7222),
(11, 'L2', 'C1', 3, 220,722),
(12, 'L2', 'C1', 3, 87,72)
;
select [MyId], [Week], [LC1_xCount], [LC2_xCount], [L2C1_xCount], [L2C2_xCount]
, [LC1_yCount], [LC2_yCount], [L2C1_yCount], [L2C2_yCount]
from
(
select myid, week, store, city, xcount, ycount,
CASE WHEN
[City]='C1' AND [Store]='L'
THEN
[xCount]
END
AS 'LC1_xCount',
CASE WHEN
[City]='C2' AND [Store]='L'
THEN
[xCount]
END
AS 'LC2_xCount',
CASE WHEN
[City]='C1' AND [Store]='L2'
THEN
[xCount]
END
AS 'L2C1_xCount',
CASE WHEN
[City]='C2' AND [Store]='L2'
THEN
[xCount]
END
AS 'L2C2_xCount',
CASE WHEN
[City]='C1' AND [Store]='L'
THEN
[yCount]
END
AS 'LC1_yCount',
CASE WHEN
[City]='C2' AND [Store]='L'
THEN
[yCount]
END
AS 'LC2_yCount',
CASE WHEN
[City]='C1' AND [Store]='L2'
THEN
[yCount]
END
AS 'L2C1_yCount',
CASE WHEN
[City]='C2' AND [Store]='L2'
THEN
[yCount]
END
AS 'L2C2_yCount'
from #yt
GROUP BY myid, week, store,city, xcount, ycount
) src;
我正在使用 SQL Server 2014。
How can I create a cross-table out of the straight table like the below?
代码 here 我在其中尝试进行多轴旋转。
示例输入
Code here only about the sample data.
其他列对列进行旋转和重新格式化后的目标
这个逻辑适合你:
创建一个额外的临时文件 table,您可以在其中存储 Store
和 City
的所有可能组合,然后与现有的 table 左连接。
从此左联接中,您将获得将用作列名称的 "calculated" 字符串(C1_L_xCount
、C1_L2_xCount
等)。
然后如下应用一个枢轴:
select ylabel.colx, ylabel.coly, y.myid, y.week, isnull(y.xCount, 0) xCount, isnull(y.yCount, 0) yCount
into #table
from (
select distinct y3.week, y1.city, y2.store, y1.city + '_' + y2.store + '_xCount' as colx, y1.city + '_' + y2.store + '_yCount' as coly
from #yt y1 cross join #yt y2 cross join #yt y3
) ylabel left join #yt y on y.week = ylabel.week and y.store = ylabel.store and y.city = ylabel.city
select * from #table --this is the additional table, the one used for pivoting
--this is your solution:
select myid
, week
, isnull(C1_L_xCount, 9) C1_L_xCount
, isnull(C1_L2_xCount, 9 ) C1_L2_xCount
, isnull(C2_L_xCount, 0) C2_L_xCount
, isnull(C2_L2_xCount, 0) C2_L2_xCount
, isnull(C1_L_yCount, 0) C1_L_yCount
, isnull(C1_L2_yCount, 0) C1_L2_yCount
, isnull(C2_L_yCount, 0) C2_L_yCount
, isnull(C2_L2_yCount, 0) C2_L2_yCount
from
(
select *
from #table
pivot ( max(xCount) for colx in ( [C1_L_xCount], [C1_L2_xCount],[C2_L_xCount], [C2_L2_xCount])) p
pivot ( max(yCount) for coly in ( [C1_L_yCount], [C1_L2_yCount],[C2_L_yCount], [C2_L2_yCount])) q
where myid is not null
) t
请检查工作演示 here。
但是,如果您需要动态添加商店和城市,则需要将其转换为 dynamic pivot。
我们重复这种情况
CASE WHEN
[City]='C1' AND [Store]='L'
THEN
[xCount]
END
AS 'LC1_xCount',
我稍微更改了估值以获得更多组合,代码 here。
或在此处输入代码:
CREATE TABLE #yt
([MyID] int, [Store] nvarchar(300), [City] nvarchar(300), [Week] int, [xCount] int, [yCount] int)
;
INSERT INTO #yt
([MyID], [Store], [City], [Week], [xCount], [yCount])
VALUES
(1, 'L', 'C1', 1, 96, 7),
(2, 'L', 'C1', 1, 138, 77),
(3, 'L2', 'C1', 1, 37, 744),
(4, 'L', 'C1', 1, 59, 74),
(5, 'L', 'C1', 2, 282,73333),
(6, 'L2', 'C2', 2, 212,7333),
(7, 'L2', 'C2', 2, 78,733),
(8, 'L', 'C2', 2, 97,73),
(9, 'L', 'C2', 3, 60,72222),
(10, 'L2', 'C2', 3, 123,7222),
(11, 'L2', 'C1', 3, 220,722),
(12, 'L2', 'C1', 3, 87,72)
;
select [MyId], [Week], [LC1_xCount], [LC2_xCount], [L2C1_xCount], [L2C2_xCount]
, [LC1_yCount], [LC2_yCount], [L2C1_yCount], [L2C2_yCount]
from
(
select myid, week, store, city, xcount, ycount,
CASE WHEN
[City]='C1' AND [Store]='L'
THEN
[xCount]
END
AS 'LC1_xCount',
CASE WHEN
[City]='C2' AND [Store]='L'
THEN
[xCount]
END
AS 'LC2_xCount',
CASE WHEN
[City]='C1' AND [Store]='L2'
THEN
[xCount]
END
AS 'L2C1_xCount',
CASE WHEN
[City]='C2' AND [Store]='L2'
THEN
[xCount]
END
AS 'L2C2_xCount',
CASE WHEN
[City]='C1' AND [Store]='L'
THEN
[yCount]
END
AS 'LC1_yCount',
CASE WHEN
[City]='C2' AND [Store]='L'
THEN
[yCount]
END
AS 'LC2_yCount',
CASE WHEN
[City]='C1' AND [Store]='L2'
THEN
[yCount]
END
AS 'L2C1_yCount',
CASE WHEN
[City]='C2' AND [Store]='L2'
THEN
[yCount]
END
AS 'L2C2_yCount'
from #yt
GROUP BY myid, week, store,city, xcount, ycount
) src;