【问题标题】:compare all data in each column in mssql比较mssql中每一列的所有数据
【发布时间】:2020-12-17 12:41:15
【问题描述】:

我有一张如下表

  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

【问题讨论】:

    标签: sql sql-server count pivot case


    【解决方案1】:

    必须应用逻辑,就好像每列包含相同的值,然后该值必须在该特定列中,否则它将为 NULL

    使用聚合和条件逻辑。我发现比较min()max() 是一种直截了当的方法:

    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
    

    【讨论】:

      【解决方案2】:

      似乎您可以将CASECOUNTMAX 一起使用:

      SELECT CASE COUNT(DISTINCT OrderID) WHEN 1 THEN MAX(OrderID) END AS OrderID,
             CASE COUNT(DISTINCT Carrier) WHEN 1 THEN MAX(Carrier) END AS Carrier,
             CASE COUNT(DISTINCT Truck) WHEN 1 THEN MAX(Truck) END AS Truck,
             CASE COUNT(DISTINCT Trailer) WHEN 1 THEN MAX(Trailer) END AS Trailer
      FROM dbo.YourTable;
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-02-28
        • 1970-01-01
        相关资源
        最近更新 更多