sql - 比较mssql中每一列的所有数据
问题描述
我有一张如下表
OrderId Carrier Truck Trailer
10001 ABC TruckA TrailerA
10001 ABC TruckA TrailerA
10001 ABC TruckB TrailerA
10001 ABC TruckC TrailerB
10001 ABC TruckC TrailerD
我的查询的输出应该是单行
OrderId Carrier Truck Trailer
10001 ABC NULL NULL
必须应用逻辑,就好像每列包含相同的值,然后该值必须在该特定列中,否则它将为 NULL
我尝试了以下查询,但没有得到正确的输出
SELECT
s.OrderId
,LEAD(s.OrderId,1) OVER (ORDER BY t.Code) AS PreviousOrderId
,c.LegalName AS CarrierName
,LEAD(c.LegalName,1) OVER (ORDER BY t.Code) AS PreviousCarrierName
,t.TruckLicensePlate
,LEAD(t.TruckLicensePlate,1) OVER (ORDER BY t.Code) AS PreviousTruckLicensePlate
,t.TrailerLicensePlate
,LEAD(t.TrailerLicensePlate,1) OVER (ORDER BY t.Code) AS PreviousTrailerLicensePlate
INTO #tempResult
FROM
OrderDetails
SELECT
CASE WHEN t.OrderId = t.PreviousOrderId
THEN t.OrderId ELSE NULL END AS OrderId
,CASE WHEN t.CarrierName = t.PreviousCarrierName
THEN t.CarrierName ELSE NULL END AS CarrierName
,CASE WHEN t.TruckLicensePlate = t.PreviousTruckLicensePlate
THEN t.TruckLicensePlate ELSE NULL END AS TruckLicensePlate
,CASE WHEN t.TrailerLicensePlate = t.PreviousTrailerLicensePlate
THEN t.TrailerLicensePlate ELSE NULL END AS TrailerLicensePlate
from #tempResult t
order by orderid desc
解决方案
必须应用逻辑,就好像每列包含相同的值,然后该值必须在该特定列中,否则它将为 NULL
使用聚合和条件逻辑。我发现比较min()
andmax()
是一种直接的方法:
select
orderid,
case when min(carrier) = max(carrier) then min(carrier) end carrier,
case when min(truck) = max(truck) then min(carrier) end truck,
case when min(trailer) = max(trailer) then min(carrier) end trailer
from orderdetails
group by orderid
推荐阅读
- python-3.x - 使用代理 Lambda 集成获取引用域/url
- java - json 满“\”
- python - python sklearn 导入在 3.5.1 中的 libquadmath.so.0 上失败
- css - 如何使每一列的所有对齐按钮都在同一行中?
- firebase - 如何在创建 Firebase 帐户时使用生成的 accessToken?
- swift - Swift 4 编程语言,inout 参数不适用于 FunctionType 作为参数
- netsuite - NetSuite:从装箱单预付模板访问销售订单字段
- python - AWS Cognito / React 前端 / Django Rest 后端的最佳模式
- wordpress - HTML链接在wp邮件中不起作用
- typescript - 在 TypeScript 中,为什么我的类型不能正确解析?