我在SQL Server 2008 R2中有一个看起来像下面的“表”的视图。
我想要一个'交叉表'视图或存储过程来获得如下所述的结果。该视图包含三个表Main --- to many Props --- to many lineitems
Mainname | Prop | lineitems
---------+------+------------
Smith | P1 | cheese
Smith | P1 | tires
Smith | P1 | baseballs
Smith | P2 | gel
Smith | P3 | windows
Smith | P3 | guitar
Jones | T4 | shoes
Lane | Q1 | cushion
Lane | Q2 | dirt
我需要让它看起来像这样:
Mainname | Prop1 | lineitems1 | lineitems2 | lineitems3 | Prop2 | lineitems1 | Prop3 | lineitems1 | lineitems2
---------+-------+------------+------------+------------+-------+------------+-------+------------+-----------
Smith | P1 | cheese | tires | baseballs | P2 | gel | P3 | windows | guitar
Jones | T4 | shoes
Lane | P5 | cushion | <null> | <null> | P6 | dirt
答案 0 :(得分:0)
这里真正的问题是桌面设计。您有一列代表许多不同的东西。在关系数据库中,这只是个坏主意。
解决问题的方法之一称为“CROSS PIVOTING”。在缺少可消耗数据的情况下,这是伪SQL,并且根据我的评论有所涉及的假设:
WITH RNs AS(
SELECT *,
DENSE_RANK() OVER (PARTITION BY [Name] ORDER BY Prop) AS PropRN
ROW_NUMBER() OVER (PARTITION BY [Name], Prop ORDER BY Item) AS ItemRN
FROM YourTable)
SELECT [Name],
MAX(CASE WHEN PropRN = 1 THEN Prop END) AS Prop1,
MAX(CASE WHEN PropRN = 1 AND ItemRN = 1 THEN Item END) AS Prop1Item1,
MAX(CASE WHEN PropRN = 1 AND ItemRN = 2 THEN Item END) AS Prop1Item2,
MAX(CASE WHEN PropRN = 1 AND ItemRN = 3 THEN Item END) AS Prop1Item3,
MAX(CASE WHEN PropRN = 2 THEN Prop END) AS Prop2,
MAX(CASE WHEN PropRN = 2 AND ItemRN = 1 THEN Item END) AS Prop2Item1,
...
FROM RNs
GROUP BY [Name];
答案 1 :(得分:0)
虽然Larnu的回答可能有效(我没试过)。对我有用的解决方案就是这个。我在表格中添加了另一栏......费用
hour magnitude tornadoCount hourlyTornadoCount Percentage Tornadoes
1: 01 AM 0 5 18 0.277777778
2: 01 AM 1 9 18 0.500000000
3: 01 AM 2 2 18 0.111111111
4: 01 AM 3 2 18 0.111111111
5: 01 PM 0 76 150 0.506666667
6: 01 PM 1 45 150 0.300000000
7: 01 PM 2 21 150 0.140000000
8: 01 PM 3 5 150 0.033333333
9: 01 PM 4 3 150 0.020000000
10: 02 AM 0 4 22 0.181818182
11: 02 AM 1 6 22 0.272727273
12: 02 AM 2 11 22 0.500000000
13: 02 AM 4 1 22 0.045454545
14: 02 PM 0 98 173 0.566473988
15: 02 PM 1 36 173 0.208092486
16: 02 PM 2 25 173 0.144508671
17: 02 PM 3 11 173 0.063583815
18: 02 PM 4 2 173 0.011560694
19: 02 PM 5 1 173 0.005780347
20: 03 AM 1 6 9 0.666666667
21: 03 AM 2 2 9 0.222222222
22: 03 AM 3 1 9 0.111111111
23: 03 PM 0 116 257 0.451361868
24: 03 PM 1 84 257 0.326848249
25: 03 PM 2 39 257 0.151750973
26: 03 PM 3 12 257 0.046692607
27: 03 PM 4 6 257 0.023346304
28: 04 AM 0 4 16 0.250000000
29: 04 AM 1 5 16 0.312500000
30: 04 AM 2 5 16 0.312500000