SQL:3列

时间:2017-05-02 12:53:27

标签: sql sql-server

我们有一个包含2列的表格:

ZahlBed | Bez
------------------------------------------------------
60      | 60 Tage betto. Für Rechnungen & Gutschriften
60      | 60 Tage netto. Für Rechnungen & Gutschriften
60      | ne
14      | 14 Tage netto. Für Rechnungen & Gutschriften
.
.
.

现在我们要在两列中搜索给定的字符串(即60)并使用SortFactor对结果进行加权:

第一个Statement将在'ZahlBed'中搜索'60'并且具有sortfactor 10。 第二次搜索'%60%'并且将给我们600左右并且具有sortfactor 11。 第三个搜索'Bez'列中的'%60%',sortfactor 20。 最后在'Bez'列中搜索60,sortfactor 15。 最后,它将由SortFactor订购。

SELECT DISTINCT TOP 20 ZahlBed,Bez,SortFactor FROM ((
SELECT ZahlBed,Bez ,10 AS SortFactor FROM XXAV_CMCTermOfPayment WHERE  (ZahlBed LIKE 60) ) UNION  
SELECT ZahlBed,Bez ,11 AS SortFactor FROM XXAV_CMCTermOfPayment WHERE ZahlBed  LIKE  '%60%' AND LEN(ZahlBed) <> LEN('60')  UNION  
SELECT ZahlBed,Bez ,20 AS SortFactor FROM XXAV_CMCTermOfPayment WHERE Bez  LIKE  '%60%'   UNION  
SELECT ZahlBed,Bez ,15 AS SortFactor FROM XXAV_CMCTermOfPayment WHERE Bez  LIKE  60)  A  
ORDER BY SortFactor ASC

预期结果如下:

ZahlBed | Bez                                          | SortFactor
-------------------------------------------------------------------
60      | 60 Tage betto. Für Rechnungen & Gutschriften | ...
60      | 60 Tage netto. Für Rechnungen & Gutschriften | ...
60      | ne                                           | ...

相反,我们得到了这个:

ZahlBed | Bez                                          | SortFactor
--------------------------------------------------------------------
60      | 60 Tage betto. Für Rechnungen & Gutschriften | 10
60      | 60 Tage netto. Für Rechnungen & Gutschriften | 10
60      | ne                                           | 10
60      | 60 Tage betto. Für Rechnungen & Gutschriften | 20
60      | 60 Tage netto. Für Rechnungen & Gutschriften | 20

我们现在的问题是,我们在'ZahlBed'和'Bez'列中得到重复,但在'SortFactor'中没有。

我们怎样才能获得不同的价值?

2 个答案:

答案 0 :(得分:2)

您可以使用case表达式来计算每行SortFactor一次:

select top 20 
    ZahlBed
  , Bez
  , SortFactor
from (
  select 
      ZahlBed
    , Bez 
    , case 
        when ZahlBed like 60 then 10
        when ZahlBed  like '%60%' and len(ZahlBed) <> len('60') then 11
        when Bez like '%60%' then 15
        when Bez like 60 then 20
        else -1
        end as SortFactor
  from xxav_cmctermOfPayment
  ) s
where SortFactor > 0
order by SortFactor

或者,您可以使用group by汇总结果,然后选择min(SortFactor)

select top 20 
    ZahlBed
  , Bez
  , min(SortFactor) as SortFactor
from (select ZahlBed, Bez, 10 as SortFactor from xxav_cmctermOfPayment where (ZahlBed like 60) 
union select ZahlBed, Bez, 11 as SortFactor from xxav_cmctermOfPayment where ZahlBed  like '%60%' and len(ZahlBed) <> len('60')
union select ZahlBed, Bez, 20 as SortFactor from xxav_cmctermOfPayment where Bez  like '%60%'
union select ZahlBed, Bez, 15 as SortFactor from xxav_cmctermOfPayment where Bez  like 60
)  A  
group by ZahlBed, Bez
order by min(SortFactor) asc

rextester演示(SQL Server):http://rextester.com/WPIDS94742

rextester演示(Oracle):http://rextester.com/RUDA52769

答案 1 :(得分:1)

尝试运行此功能。

select top 20 ZahlBed, Bez, SortFactor from
    (
    select ZahlBed,Bez, 
        case 
        when (ZahlBed LIKE 60) then 10
        when ZahlBed  LIKE  '%60%' AND LEN(ZahlBed) <> LEN('60') then 11
        when Bez  LIKE  '%60%' then 20
        when Bez  LIKE  60 then 15 
        end
    as sortFactor
    from XXAV_CMCTermOfPayment
    where 
        (
            ZahlBed LIKE 60
            or
            (ZahlBed  LIKE  '%60%' AND LEN(ZahlBed) <> LEN('60') )
            or
            Bez  LIKE  '%60%'
            or
            Bez  LIKE  60
        )
    ) t 
order by SortFactor