Pet*_*ete 5 optimization pivot t-sql
我编写的以下查询在一定程度上起作用。我发现的问题是,在每个泵中,电缆等都可以在每个零件列中列出。例子:
我想得到的是列有每个泵、电缆等的井,而不是我目前得到的只是第一个泵、电缆等。
这是我正在运行的查询:
With CTE AS(
SELECT Pull_Date, Well_Name, Part1 Part, Part1_PN PartPN, Part1_SN PartSN FROM testtest
UNION ALL
SELECT Pull_Date, Well_Name, Part2, Part2_PN, Part2_SN from testtest
UNION ALL
SELECT Pull_Date, Well_Name, Part3, Part3_PN, Part3_SN from testtest
)
Select Pull_Date, Well_Name,
MIN(CASE WHEN Part='BODH' THEN 'BODH' ELSE NULL END) [BODH],
MIN(CASE WHEN Part='BODH' THEN PartPN Else NULL END) BODH_PN,
MIN(CASE WHEN Part='BODH' THEN PartSN ELSE NULL END) BODH_SN,
MIN(CASE WHEN Part='Cable' THEN 'Cable' ELSE NULL END) [Cable],
MIN(CASE WHEN Part= 'Cable' THEN PartPN Else NULL END) Cable_PN,
MIN(CASE WHEN Part= 'Cable' THEN PartSN ELSE NULL END) Cable_SN,
MIN(CASE WHEN Part= 'Pump' THEN 'Pump' ELSE Null END) [Pump],
MIN(CASE WHEN Part= 'Pump' THEN PartPN ELSE NULL END) Pump_PN,
MIN(CASE WHEN Part= 'Pump' THEN PartSN ELSE NULL END) Pump_SN,
MIN(CASE WHEN Part= 'MLE' THEN 'MLE' ELSE NULL END) [MLE],
MIN(CASE WHEN Part= 'MLE' THEN PartPN ELSE NULL END) MLE_PN,
MIN(CASE WHEN Part= 'MLE' THEN PartSN ELSE NULL END) MLE_SN,
MIN(CASE WHEN Part= 'AGH' THEN 'AGH' ELSE NULL END) [AGH],
MIN(CASE WHEN Part= 'AGH' THEN PartPN ELSE NULL END) AGH_PN,
MIN(CASE WHEN Part= 'AGH' THEN PartSN ELSE NULL END) AGH_SN
FROM CTE
GROUP BY Pull_Date, Well_Name
Run Code Online (Sandbox Code Playgroud)
这是我目前收到的一个例子:
我对 SQL Server PIVOT 不太熟悉,或者在这种情况下甚至需要这样做。
感谢您对此提供的任何帮助,并在此先感谢您。
编辑:
不幸的是,我无法添加我想要的图片,因此我将尝试对其进行解释。
我想把它排成一排,所以它看起来有点像这样:
Pull Date| Well_Name | BODH1 | BODH1_PN | BODH1_SN | BODH2 | BODH2_PN | BODH2_SN
Run Code Online (Sandbox Code Playgroud)
泵、电缆、MLE 等也会重复。我有 20 个部分的柱子,我想把它们拉出来,这样我就可以很容易地从泵 1 到泵 5(有些井有 5 个少一些)。最终这些数据将被插入到另一个表中来更新它。
编辑2:
链接到我创建的测试数据:SQLFiddle
小智 2
这应该有效。我获取了原始 CTE,按零件和日期进行分区并编号。这使得每个日期的每个部分都有自己的编号,从 1 开始。
然后在 case 语句中添加 WHERE Number = N 可以使每个部分都是唯一的。
最后,将列名称修改为具有各自的编号。
由于这很不方便,因此可以使用动态 sql 来生成重复的代码。
With CTE AS (SELECT * FROM
(SELECT ROW_NUMBER() OVER(PARTITION BY Part + Pull_Date ORDER BY PartSN) AS [Number],
Pull_Date,
Well_Name,
Part,
PartSN,
PartPN
FROM (
SELECT Pull_Date, Well_Name, Part1 Part, Part1_PN PartPN, Part1_SN PartSN
FROM test
UNION ALL
SELECT Pull_Date, Well_Name, Part2, Part2_PN, Part2_SN from test
UNION ALL
SELECT Pull_Date, Well_Name, Part3, Part3_PN, Part3_SN from test
UNION ALL
SELECT Pull_Date, Well_Name, Part4, Part4_PN, Part4_SN from test
UNION ALL
SELECT Pull_Date, Well_Name, Part5, Part5_PN, Part5_SN from test
UNION ALL
SELECT Pull_Date, Well_Name, Part6, Part6_PN, Part6_SN from test
) subquery) new
)
Select Pull_Date, Well_Name,
MIN(CASE WHEN Part='BODH' AND Number=1 THEN 'BODH' ELSE NULL END) [BODH1],
MIN(CASE WHEN Part='BODH' AND Number=1 THEN PartPN Else NULL END) BODH_PN1,
MIN(CASE WHEN Part='BODH' AND Number=1 THEN PartSN ELSE NULL END) BODH_SN1,
MIN(CASE WHEN Part='BODH' AND Number=2 THEN 'BODH' ELSE NULL END) [BODH2],
MIN(CASE WHEN Part='BODH' AND Number=2 THEN PartPN Else NULL END) BODH_PN2,
MIN(CASE WHEN Part='BODH' AND Number=2 THEN PartSN ELSE NULL END) BODH_SN2,
MIN(CASE WHEN Part='Cable' AND Number=1 THEN 'Cable' ELSE NULL END) [Cable1],
MIN(CASE WHEN Part= 'Cable' AND Number=1 THEN PartPN Else NULL END) Cable_PN1,
MIN(CASE WHEN Part= 'Cable' AND Number=1 THEN PartSN ELSE NULL END) Cable_SN1,
MIN(CASE WHEN Part='Cable' AND Number=2 THEN 'Cable' ELSE NULL END) [Cable2],
MIN(CASE WHEN Part= 'Cable' AND Number=2 THEN PartPN Else NULL END) Cable_PN2,
MIN(CASE WHEN Part= 'Cable' AND Number=2 THEN PartSN ELSE NULL END) Cable_SN2,
MIN(CASE WHEN Part= 'Pump' AND Number=1 THEN 'Pump' ELSE Null END) [Pump1],
MIN(CASE WHEN Part= 'Pump' AND Number=1 THEN PartPN ELSE NULL END) Pump_PN1,
MIN(CASE WHEN Part= 'Pump' AND Number=1 THEN PartSN ELSE NULL END) Pump_SN1,
MIN(CASE WHEN Part= 'Pump' AND Number=2 THEN 'Pump' ELSE Null END) [Pump2],
MIN(CASE WHEN Part= 'Pump' AND Number=2 THEN PartPN ELSE NULL END) Pump_PN2,
MIN(CASE WHEN Part= 'Pump' AND Number=2 THEN PartSN ELSE NULL END) Pump_SN2,
MIN(CASE WHEN Part= 'MLE' AND Number=1 THEN 'MLE' ELSE NULL END) [MLE1],
MIN(CASE WHEN Part= 'MLE' AND Number=1 THEN PartPN ELSE NULL END) MLE_PN1,
MIN(CASE WHEN Part= 'MLE' AND Number=1 THEN PartSN ELSE NULL END) MLE_SN1,
MIN(CASE WHEN Part= 'MLE' AND Number=2 THEN 'MLE' ELSE NULL END) [MLE2],
MIN(CASE WHEN Part= 'MLE' AND Number=2 THEN PartPN ELSE NULL END) MLE_PN2,
MIN(CASE WHEN Part= 'MLE' AND Number=2 THEN PartSN ELSE NULL END) MLE_SN2,
MIN(CASE WHEN Part= 'AGH' AND Number=1 THEN 'AGH' ELSE NULL END) [AGH1],
MIN(CASE WHEN Part= 'AGH' AND Number=1 THEN PartPN ELSE NULL END) AGH_PN1,
MIN(CASE WHEN Part= 'AGH' AND Number=1 THEN PartSN ELSE NULL END) AGH_SN1,
MIN(CASE WHEN Part= 'AGH' AND Number=2 THEN 'AGH' ELSE NULL END) [AGH2],
MIN(CASE WHEN Part= 'AGH' AND Number=2 THEN PartPN ELSE NULL END) AGH_PN2,
MIN(CASE WHEN Part= 'AGH' AND Number=2 THEN PartSN ELSE NULL END) AGH_SN2
FROM CTE
GROUP BY Pull_Date, Well_Name
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
102 次 |
最近记录: |