【问题标题】:Id Column having diffrent values in another column need show with specilal value在另一列中具有不同值的 Id 列需要以特殊值显示
【发布时间】:2016-05-15 00:24:53
【问题描述】:

我在这个表 Id 列中有一个表测试,FuelIdFuelDesc 列在那里。值如下表所示,基于我需要创建如下表的前三列,请帮助我获取。

ID   FuelID   FuelDesc 
100   01       Elec     
101   02       Gas      
102   02       Gas      
100   02       Gas     
101   01       Elec    
103   01       Elec     

O/P:-

ID    Pamenttype       
100   Both        
101   Both       
102   Gas         
103   Elec

【问题讨论】:

  • 你试过了吗?如果有请分享。
  • SELECT ID, PaymentType = CASE WHEN COUNT(DISTINCT FuelId) > 1 THEN 'Both' ELSE MAX(FuelDESC) END FROM test GROUP BY ID

标签: mysql sql sql-server sql-server-2008


【解决方案1】:
WITH fuelCount
AS
(
    SELECT ID, COUNT(FuelID) AS fuelCount 
    FROM Test GROUP BY ID
)
SELECT fc.ID, 
CASE 
    WHEN fc.fuelCount > 1 THEN 'BOTH'
    ELSE (SELECT t.FuelDesc FROM Test t WHERE t.ID = fc.ID)
END AS Pamenttype
FROM fuelCount fc 

【讨论】:

    【解决方案2】:

    您可以将Both 定义为一条记录为FuelID = '01',另一条记录为FuelID = '02'。假设 {ID, FuelID} 在表 Test 中是唯一的:

    with BothPaymentTypes as (
        select t1.ID
        from Test t1
        join Test t2 on t1.ID = t2.ID
        where t1.FuelID = '01'
        and t2.FuelID = '02'
    )
    select ID, 'Both' as Pamenttype
    from BothPaymentTypes
    union all
    select ID, FuelDesc
    from Test
    where ID not in (select ID from BothPaymentTypes)
    

    [SQL Fiddle Demo]


    或者,您可以使用 COUNT 和 HAVING 子句避免自联接 - 再次假设 {ID, FuelID} 是唯一的:

    with BothPaymentTypes as (
        select ID
        from Test
        group by ID
        having count(*) = 2
    )
    select ID, 'Both' as Pamenttype
    from BothPaymentTypes
    union all
    select ID, FuelDesc
    from Test
    where ID not in (select ID from BothPaymentTypes)
    

    [SQL Fiddle Demo]

    【讨论】:

      【解决方案3】:

      您可以在COUNTMAX 函数的帮助下使用CASE 表达式:

      SELECT
          ID,
          PaymentType = CASE WHEN COUNT(FuelId) > 1 THEN 'Both' ELSE MAX(FuelDESC) END
      FROM test
      GROUP BY ID
      

      【讨论】:

        【解决方案4】:
        SELECT ID, CASE WHEN rowCount = 1 THEN FuelDesc ELSE 'Both' END AS Pamenttype
        FROM
        (SELECT ID, MAX(FuelDesc) AS FuelDesc, COUNT(*) AS rowCount
         FROM mytable
         GROUP BY ID)
        

        【讨论】:

          猜你喜欢
          • 2016-03-05
          • 2017-02-14
          • 1970-01-01
          • 1970-01-01
          • 2022-07-18
          • 2012-05-25
          • 1970-01-01
          • 1970-01-01
          • 2018-08-09
          相关资源
          最近更新 更多