sql - 缩短重复的 SQL 查询
问题描述
有没有更好的方法来编写以下代码,可能是某种循环等。在此之前,我在查询中创建了一个临时表。然后我尝试创建不同的列,这些列按时间顺序为我提供了在一行中发生在客户帐户上的操作。
SELECT
a.*,
Action_1 = (SELECT Rating_Changed_To FROM #TempICHist WHERE (IC_ID_18 = a.ICID_18 AND Rank = '1' )),
Action_1_Time = (SELECT Change_Date FROM #TempICHist WHERE (IC_ID_18 = a.ICID_18 AND Rank = '1' )),
Action_2 = (SELECT Rating_Changed_To FROM #TempICHist WHERE (IC_ID_18 = a.ICID_18 AND Rank = '2' )),
Action_2_Time = (SELECT Change_Date FROM #TempICHist WHERE (IC_ID_18 = a.ICID_18 AND Rank = '2' )),
Action_3 = (SELECT Rating_Changed_To FROM #TempICHist WHERE (IC_ID_18 = a.ICID_18 AND Rank = '3' )),
Action_3_Time = (SELECT Change_Date FROM #TempICHist WHERE (IC_ID_18 = a.ICID_18 AND Rank = '3' )),
Action_4 = (SELECT Rating_Changed_To FROM #TempICHist WHERE (IC_ID_18 = a.ICID_18 AND Rank = '4' )),
Action_4_Time = (SELECT Change_Date FROM #TempICHist WHERE (IC_ID_18 = a.ICID_18 AND Rank = '4' )),
Action_5 = (SELECT Rating_Changed_To FROM #TempICHist WHERE (IC_ID_18 = a.ICID_18 AND Rank = '5' )),
Action_5_Time = (SELECT Change_Date FROM #TempICHist WHERE (IC_ID_18 = a.ICID_18 AND Rank = '5' )),
Action_6 = (SELECT Rating_Changed_To FROM #TempICHist WHERE (IC_ID_18 = a.ICID_18 AND Rank = '6' )),
Action_6_Time = (SELECT Change_Date FROM #TempICHist WHERE (IC_ID_18 = a.ICID_18 AND Rank = '6' )),
Action_7 = (SELECT Rating_Changed_To FROM #TempICHist WHERE (IC_ID_18 = a.ICID_18 AND Rank = '7' )),
Action_7_Time = (SELECT Change_Date FROM #TempICHist WHERE (IC_ID_18 = a.ICID_18 AND Rank = '7' )),
Action_8 = (SELECT Rating_Changed_To FROM #TempICHist WHERE (IC_ID_18 = a.ICID_18 AND Rank = '8' )),
Action_8_Time = (SELECT Change_Date FROM #TempICHist WHERE (IC_ID_18 = a.ICID_18 AND Rank = '8' ))
FROM
#TempICs a
ORDER BY
a.Programme,a.IC_Created_Date
我希望问题很清楚,但如果有混淆,我可以回答。
解决方案
一种方法是使用apply
条件聚合:
select a.*, Act_1.*
from #tempics a outer apply
( SELECT MAX(CASE WHEN RANK = 1 THEN Rating_Changed_To END) AS Action_1,
MAX(CASE WHEN RANK = 2 THEN Rating_Changed_To END) AS Action_2,
. . .
MAX(CASE WHEN RANK = 1 THEN Change_Date END) AS Action_1_Time,
MAX(CASE WHEN RANK = 2 THEN Change_Date END) AS Action_2_Time,
. . .
FROM #TempICHist
WHERE IC_ID_18 = a.ICID_18 AND Rank IN (1,2,3,4,5,6,7,8)
) Act_1;
推荐阅读
- c# - 将文件流传递给 System.Text.Json.Utf8JsonReader
- python - 如何对字符串数据进行标准化和标准缩放
- angular - 是否支持将 Medium 提要嵌入 Angular
- java - 如何将编程获得的坐标(纬度、经度)与存储在 CSV 文件中的坐标进行比较
- css - 在 Selenium IDE 变量中存储与 CSS 选择器匹配的元素列表
- android - 如何用Java模拟Android中的按钮点击?
- reactjs - React - 导入依赖于另一个已经依赖于 package.json 的依赖项时出错
- javascript - 按星期、星期和年份设置日期
- node.js - 缺少必需的标头授权。确保在 Azure Cosmos DB 中传递了有效的授权令牌
- amazon-web-services - AWS S3 存储桶 MFA 启用