2017-09-28 1 views
-7

Comment transformer la table source en table cible? par exemple, P111 et C111 sont connectés. Je les veux dans la même rangée et à chaque fois qu'ils sont connectés, case_type devrait être politique.Division de la colonne en différents champs avec SQL Server

1. Une combinaison de revendications/politiques partagent un ID et sont préfixées avec P pour la politique et C pour la revendication.

2.La politique-date pour une réclamation et une politique sont identiques pour un ID donné.

3. Il existe une relation 1 pour 1 pour les règles et les revendications. 4. S'il existe une règle et une revendication, le type case_type doit être une règle.

Source Table        Target Table 
+-----------+-------------+-----------+ +--------+-------+-------------+-----------+ 
| policy_id | policy_date | case_type | | Policy | Claim | policy_date | case_type | 
+-----------+-------------+-----------+ +--------+-------+-------------+-----------+ 
| p111  | 2017-05-10 | Policy | | p103 | c103 | 2017-06-10 | Policy | 
| c111  | 2017-05-10 | Claim  | | p111 | c111 | 2017-05-10 | Policy | 
| p103  | 2017-06-10 | Policy | | p124 | NULL | 2017-05-10 | Policy | 
| c103  | 2017-06-10 | Claim  | | NULL | c133 | 2017-06-10 | Claim  | 
| p124  | 2017-05-10 | Policy | | p144 | NULL | 2017-09-10 | Policy | 
| c133  | 2017-06-10 | Claim  | | p155 | c155 | 2017-07-10 | Policy | 
| p155  | 2017-06-10 | Policy | | NULL | c177 | 2017-09-10 | Claim  | 
| c155  | 2017-07-10 | Claim  | |AI100 |EC100 |2017-08-10| Policy +--------+-------+--------------+ 
| p144  | 2017-09-10 | Policy |  
| c177  | 2017-09-10 | Claim  | 
| AI100  | 2017-08-10 | Policy | 
| EC100  | 2017-08-10 | Claim  | 
+-----------+-------------+-----------+  
+1

Une auto-jointure est la réponse, alors s'il vous plaît postez votre tentative pour le faire, et quelle erreur vous avez. –

+1

Comment déterminez-vous quels enregistrements d'ID de stratégie/revendication sont associés? Je ne vois rien qui indique que l'un est lié à l'autre. Qu'est-il arrivé à 'C155'? Pourquoi 'P144' et' C177' sont sur des lignes différentes? Quelle est votre logique ici ...? – Siyual

+0

Est-ce que PolicyDate de P155 est une faute de frappe? – Xedni

Répondre

1

Cette réponse a beaucoup d'hypothèses que vous n'avez pas fourni une logique de la façon dont vous voulez que votre première table pour accéder à votre seconde. Voici les hypothèses que j'ai faites:

  1. Une combinaison de règles/revendications partagent un ID et sont préfixées par P pour la règle et C pour la revendication.
  2. La date de stratégie d'une revendication et d'une stratégie est identique pour un ID donné.
  3. Il existe une relation 1 pour 1 pour les règles et les revendications.
  4. S'il existe une règle et une revendication, le type case_type doit être une règle.

Avec ces hypothèses, voici la variable tableau I fait pour tester ceci:

Edit: Mise à jour pour les nouvelles données d'échantillons

DECLARE @tbl TABLE (
policy_id NVARCHAR(5), 
policy_date date, 
case_type NVARCHAR(6) 
) 

INSERT @tbl VALUES 
('p111','05/10/2017','Policy'), ('c111','05/10/2017','Claim'), 
('p103','06/10/2017','Policy'), ('c103','06/10/2017','Claim'), 
('p124','05/10/2017','Policy'), ('c133','06/10/2017','Claim'), 
('p155','07/10/2017','Policy'), ('c155','07/10/2017','Claim'), 
('p144','09/10/2017','Policy'), ('c177','09/10/2017','Claim'), 
('AI100','2017-08-10','Policy'), ('EC100','2017-08-10','Claim') 

Et est la requête ici pour obtenir le jeu de résultats vous sont en train de chercher.

SELECT 
    MAX(CASE case_type 
     WHEN 'Policy' THEN policy_id 
     END) AS Policy, 
    MAX(CASE case_type 
     WHEN 'Claim' THEN policy_id 
     END) AS Claim, 
    MAX(policy_date) AS policy_date, 
    MIN(CASE case_type   --This is a custom priority for which case_type is displayed. 
     WHEN 'Policy' THEN 1 --If there is a policy then it's policy, 
     WHEN 'Info Only' Then 2 --if there is no policy but there is an info only then it's info only, 
     WHEN 'Claim' THEN 3  --and if it's only a claim then it's claim. 
     END) AS case_type 
FROM @tbl 
GROUP BY 
    REPLACE(REPLACE(REPLACE(REPLACE(policy_id,'ai',''), 'ec', ''), 'c', ''), 'p', '') --Does not include info only, I'm not sure what prefix is applied for that 
    --SUBSTRING(policy_id, PATINDEX('%[0-9.-]%', policy_id), 10) 

L'option de sous-chaîne est inutile pour l'ensemble d'exemples en cours, mais elle est plus complète. Il supprimera toutes les lettres qui préfixent les chiffres jusqu'à 10 chiffres (la limite pour le type de données int). Voir this awesome blog pour plus de détails, cependant comme nous ne faisons que supprimer les lettres en préfixant je me suis arrêté à l'étape 2.

+0

Vos hypothèses sont justes. Je n'ai aucune colonne Claim dans la première table, j'ai besoin de la déduire de la première table avec une requête. – Mikkybukky

+0

Cela ne signifie pas que je n'ai pas de colonne de revendications dans la table de gauche. Les règles et les revendications sont stockées dans policyID. – Mikkybukky

+0

Cette requête ne nécessite pas de colonne de revendications dans la table de gauche, elle la crée en fonction de policyID et de case_type? Compte tenu des données que vous avez fournies, cela génère la sortie que vous avez demandée. –