Бір бағандағы мәнге сүйене отырып, топтағы басқа бағандағы мәнді өзгертіңіз

Мен SQL Server үшін жаңа.

Менің үстелім бар:

Group   id     DEPT     marks         
--------------------------------------
 A      001      CS      P                  
 A      002     ECE      P  
 A      003     MC       P  
 B      561     CS       F  
 B      781     IT       F  
 C      789     CS       F  
 C      003     CS       F

Егер бөлімде «жаңа баған» департаментте сәтсіздік бар болса, Ақаулар «F» мәнін алуға тиіс Мұнда CS құрамында F бар, сондықтан бүкіл бөлім дефектілердің бағандар бағанында 'F' мәнін алу керек мұнда басқа бөлімдер сияқты  мысалы: - ECE құрамында P бар, сондықтан ол Ddeptcontain faillтарында 'P' бар Мен осы таңдау нұсқауын орындауға тырысамын

SELECT group,  
      id,  
    dept,  
      marks,  
CASE WHEN marks='P' THEN  'P'   
            ELSE 'F'  
            END Ddeptcontainfailure  
 FROM Depttable

Мен шығаратын өнім


Group   id     DEPT     marks            Ddeptcontainfailures
-----------------------------------------------------
 A      001     CS       P                  p   
 A      002     ECE      P                  P  
 A      003     MC       P                  P  
 B      561     CS       F                  F  
 B      781     IT       F                  F  
 C      789     CS       P                  p  
 C      003     CS       P                  p  

Мұны қалай алуға болады?

Қажетті шығу


Group   id     DEPT     marks      Ddeptcontainfailures
-----------------------------------------------------
 A      001     CS       P          F       
 A      002     ECE      P          P  
 A      003     MC       P          P  
 B      561     CS       F          F  
 B      781     IT       F          F  
 C      789     CS       P          F  
 C      003     CS       P          F  
2

6 жауаптар

Бұл әрекетті орындау үшін MIN бөлімді пайдалана аласыз. Бұл таңбалар үшін тек екі мән бар болғандықтан жұмыс істейді. Егер сіздің нақты деректеріңізде басқа мәндер болса, сіз MIN функциясындағы өрнек өрнегін қолдана аласыз.

declare @Something table
(
    MyGroup char(1)
    , id char(3)
    , DEPT varchar(3)
    , marks char(1)
)

insert @Something values
('A', '001', 'CS', 'P')
, ('A', '002', 'ECE', 'P')
, ('A', '003', 'MC', 'P')
, ('B', '561', 'CS', 'F')
, ('B', '781', 'IT', 'F')
, ('C', '789', 'CS', 'F')
, ('C', '003', 'CS', 'F')

select s.*
    , min(marks) over(partition by DEPT)
from @Something s
order by s.MyGroup
    , s.id
    , s.DEPT
5
қосылды
ThankS, ол жұмыс істеді
қосылды автор PEL1, көзі

cte құрылымымен басқа балама шешім:

create table #temp
(
    MyGroup char(1)
    , id char(3)
    , DEPT varchar(3)
    , marks char(1)
)

insert #temp values
('A', '001', 'CS', 'P')
, ('A', '002', 'ECE', 'P')
, ('A', '003', 'MC', 'P')
, ('B', '561', 'CS', 'F')
, ('B', '781', 'IT', 'F')
, ('C', '789', 'CS', 'F')
, ('C', '003', 'CS', 'F')

;with cte as (
select distinct t.DEPT
from #temp t
where t.marks = 'F'
)
select t.*, (case when t.DEPT in (select DEPT from cte) then 'F' else 'T' end)
from #temp t
0
қосылды

Балама:

SELECT [group],  
      id,  
    Depttable.dept,  
      marks,  
CASE WHEN isnull(failures, 0) = 0 THEN  'P'   
            ELSE 'F'  
            END Ddeptcontainfailure  
 FROM Depttable
 LEFT OUTER JOIN (
    select count(*) as failures, alias.dept
    from Depttable alias
    where marks='f'
    group by alias.dept
 ) X on x.dept = Depttable.dept
0
қосылды

Досыма мұны істеудің бірнеше жолы бар

Ең оңай жолдардың бірі - ішкі сұраныстарды пайдалану

SELECT GROUP
      ,ID
      ,DEPT
      ,MARKS
      ,CASE WHEN DP.DEPT IS NULL THEN 'P' ELSE 'F' END AS DDEPTCONTAINFAILURE
FROM DEPTTABLE DT
LEFT JOIN (SELECT DISTINCT DEPT 
            FROM DEPTTABLE
            WHERE MARKS LIKE 'F') DP 
ON (DT.DEPT = DP.DEPT) 

Егер сіз кафедрада сәтсіздік бар екенін білгіңіз келсе, алдымен қайсысын білуіңіз керек. онда сіз жалаушаны пайдалана аласыз, менің жағдайда CASE WHEN DP.DEPT IS NULL білу үшін пайдаланамын

Іске сәт

0
қосылды
SELECT group,  
      id,  
    dept,  
      marks,  
CASE WHEN 'F' in (select marks from Depttable di where di.marks=do.marks)    THEN  'F'   
            ELSE 'P'  
            END Ddeptcontainfailure  
 FROM Depttable do

немесе

SELECT group,  
      id,  
    dept,  
      marks,  
(select min(marks) from Depttable di where di.marks=do.marks) Ddeptcontainfailure  
 FROM Depttable do
0
қосылды

Егер Ddeptcontain бағаныңыздағы бағаныңызда тек 2 мән болса, сіз бұл сұрақты пайдалана аласыз

    declare @temp table(Grou varchar(10), id varchar(10), Dept varchar(10), marks varchar(10))

    insert into @temp (Grou, id, dept, marks)
    select 'A', '001' ,'CS' , 'P'
    union
    select 'A', '002' ,'ECE', 'P'
     union
    select 'A', '003' ,'MC', 'P'
     union
    select 'B', '561' ,'CS', 'F'
     union
    select 'B', '781' ,'IT', 'F'
     union
    select 'C', '789' ,'CS', 'F'
     union
    select 'C', '003' ,'CS', 'F'


    select t.Grou, t.id, t.Dept, t.marks, (select top 1 B.marks from @temp B where B.Dept = t.Dept order by B.marks) as Ddeptcontainfailures

    from @temp t

B.marks бойынша сұрыптаған кезде «F» әрқашан бірінші нәтижеге жетеді

0
қосылды