Toutes mes excuses si cela a été demandé auparavant, j'ai passé au peigne fin beaucoup de questions mais je n'ai pas pu trouver une réponse que je pourrais appliquer à ce problème.

Je suis en train de créer un rapport SSRS à partir d'une base de données à laquelle j'ai accès en lecture seule et j'ai du mal à sélectionner les données dans le format que je souhaite.

Table 1: Referenced Data
==== ============= 
 ID   Description  
==== ============= 
 1    Apple        
 2    Orange       
 3    Pear         
==== ============= 

Table 2: Records
==== ====== ======== 
 ID   Data    Tag   
==== ====== ======== 
 1   1      List    
 2   2      List    
 3   Red    String  
 4   Blue   String  
 5   3      List    
==== ====== ======== 

Ce que je voudrais voir, c'est:

Report
========== ========= 
 RecordNo   Content  
========== ========= 
    1       Apple    
    2       Orange   
    3       Red      
    4       Blue     
    5       Pear     
========== ========= 

Le problème est que la colonne Data de T2 est nvarchar tandis que la colonne ID de T1 est bigint. Bien que je puisse éviter une erreur de conversion en sélectionnant uniquement les lignes avec la balise List, je perds les données String.

Existe-t-il un moyen de faire ce que j'essaie de faire dans une instruction select? On dirait que c'est quelque chose qui pourrait être fait avec un peu de créativité, mais je suis toujours dans le processus d'apprentissage et mon SQL n'est pas encore tout à fait là.

1
Jared 27 nov. 2017 à 20:51

3 réponses

Meilleure réponse
SELECT
    rec.Id
    ,Content = CASE WHEN data.Id IS NOT NULL THEN data.Description ELSE rec.Data END
FROM
    Records rec
    LEFT JOIN ReferencedData data
    ON rec.Tag <> 'String'
    AND rec.Data = CAST(data.Id AS NVARCHAR(50))

Vous pouvez convertir le BIGINT en NVARCHAR dans le cadre de votre condition de jointure, ce qui évitera l'erreur de conversion implicite.

0
Matt 27 nov. 2017 à 18:20
select table2.id
     , coalesce(table1.description, table2.Data) content
  from table2
  left join table1
    on table2.tag <> 'String'
   and table1.id = table2.data
 order by table2.id

Cela fonctionne dans MySQL (SQL Fiddle) mais nécessite un léger changement dans SQL Server (< a href = "http://sqlfiddle.com/#!6/f9e25/3" rel = "nofollow noreferrer"> SQL Fiddle ) et Oracle (SQL Fiddle):

select table2.id
     , coalesce(table1.description,table2.Data) content
  from table2
  left join table1
    on table2.tag <> 'String'
   and table1.id = case when table2.tag <> 'String' then table2.data end
 order by table2.id

Et PostgreSQL (SQL Fiddle) a besoin d'un tweek supplémentaire:

select table2.id
    , coalesce(table1.description,table2.Data) as content
  from table2
  left join table1
    on table2.tag <> 'String'
   and cast(table1.id as varchar(6)) = table2.data
 order by table2.id
0
Sentinel 27 nov. 2017 à 19:45

Vous pouvez essayer quelque chose comme ceci:

;WITH DataNum AS
(
 SELECT ID, Data FROM Records WHERE ISNUMERIC(Data) = 1
)
SELECT dn.ID, rd.Description
FROM DataNum dn
JOIN ReferencedData rd ON dn.Data = rd.ID
UNION ALL
SELECT ID, Data
FROM Records
WHERE ISNUMERIC(Data) <> 1
0
randcd 27 nov. 2017 à 18:01
47516980