2017-03-28 4 views
0

Dans SQL j'ai une table avec 3 colonnes, notamment de:Comment changer les enregistrements dans la table pour nommer une colonne dans SQL?

ID  NLV   SGLV 
m0001 27/03/2017 8 
m0001 28/03/2017 3.5 
m0002 28/03/2017 8 
m0003 26/03/2017 12 
M0001 27/03/2017 2 

Maintenant, je veux écrire une requête SQL pour créer une nouvelle table ont le format suit:

ID SUM(SGLV) 26 (26/03/2017) 27 (27/03/2017) 28 (28/03/2017) 
M0001 13.5 0    10    3.5 
m0002 8  0    0    8 
m0003 12  12    0    0 

Alors, peut quelqu'un m'aider?

+1

SQL Server ou MySQL ?? Assurez-vous d'avoir marqué le SGBDR correct. –

+1

Vos données n'ont que 3 jours (26, 27, 28) ou plus? – TriV

+0

@TriV c'est un exemple. Les données comprennent plusieurs lignes – user1465351

Répondre

1

Dans SQL Server, ci-dessous requête vous donne la puissance requise

DECLARE @SAMPLEDATA TABLE(ID VARCHAR(100),  NLV DATETIME,  SGLV DECIMAL(18,1)) 
INSERT INTO @SAMPLEDATA VALUES 
('m0001', '03/27/2017', 8), 
('m0001', '03/28/2017', 3.5), 
('m0002', '03/28/2017', 8), 
('m0003', '03/26/2017', 12), 
('M0001', '03/27/2017', 2) 

SELECT ID,ISNULL([03/26/2017],0)[03/26/2017],ISNULL([03/27/2017],0) [03/27/2017],ISNULL([03/28/2017],0)[03/28/2017] FROM 
(
    SELECT ID,NLV,SGLV FROM @SAMPLEDATA 
)T 
PIVOT 
(
    SUM(SGLV) FOR NLV IN([03/26/2017],[03/27/2017],[03/28/2017]) 
)PIV; 

sortie

------------------------------------------ 
--ID 03/26/2017 03/27/2017 03/28/2017 
------------------------------------------ 
m0001 0.0   10.0  3.5 
m0002 0.0   0.0   8.0 
m0003 12.0  0.0   0.0 
------------------------------------------ 

UTILISATION QUERY DYNAMIQUE: Comme mentionné dans les commentaires, si la sortie doit être générée pour le mois complet en cours, la même chose peut être obtenue en utilisant la requête dynamique plutôt que d'écrire CASE pour chaque jour du mois. Essayez la requête ci-dessous:

DECLARE @DYNAMICQUERY NVARCHAR(MAX)='' 
DECLARE @DATERANGE VARCHAR(MAX)='' 
;WITH COMPLETEMONTH (COL) 
AS 
(
     SELECT CAST(CAST(MONTH(CURRENT_TIMESTAMP) AS  VARCHAR(2))+'/'+'01/'+CAST(YEAR(CURRENT_TIMESTAMP) AS VARCHAR(4)) AS DATETIME) 
      UNION ALL 
     SELECT DATEADD(D,1,COL)COL FROM COMPLETEMONTH 
      WHERE COL< DATEADD(D,-1, (DATEADD(M,1,CAST(CAST(MONTH(CURRENT_TIMESTAMP) AS  VARCHAR(2))+'/'+'01/'+CAST(YEAR(CURRENT_TIMESTAMP) AS VARCHAR(4)) AS  DATETIME)))) 
) 
SELECT @[email protected]+'['+CONVERT(VARCHAR,COL,101)+']'+',' FROM  COMPLETEMONTH 
SET @DATERANGE=LEFT(@DATERANGE,LEN(@DATERANGE)-1) 

SELECT @DYNAMICQUERY= 
'SELECT ID,'[email protected]+' FROM 
(
    SELECT ''m0001'' ID , ''03/27/2017'' NLV, 8 SGLV 
    UNION ALL 
    SELECT ''m0001'', ''03/28/2017'', 3.5 
    UNION ALL 
    SELECT ''m0002'', ''03/28/2017'', 8 
    UNION ALL 
    SELECT ''m0003'', ''03/26/2017'', 12 
    UNION ALL 
    SELECT ''M0001'', ''03/27/2017'', 2 
)T 
PIVOT 
(
    SUM(SGLV) FOR NLV IN('[email protected]+') 
)PIV;' 

EXEC SP_EXECUTESQL @DYNAMICQUERY,N'@DATERANGE  VARCHAR(MAX)',@[email protected] 
+0

Nom de colonne dans le tableau de sortie du jour 1 -> 30 tous les mois? – user1465351

+0

la requête ci-dessus est basée sur des données d'échantillon fournies par vous. S'il vous plaît ajouter des détails si vous avez une plage spécifique de date ou vous voulez obtenir la sortie pour le mois complet par défaut, de sorte que je vais modifier ma réponse et ajoutera les détails requis dans la solution. –

+0

J'ai ajouté plus d'informations ci-dessus, merci – user1465351

1
CREATE TABLE #Table1 
     ([ID] varchar(5), [NLV] varchar(10), [SGLV] float) 
    ; 

    INSERT INTO #Table1 
     ([ID], [NLV], [SGLV]) 
    VALUES 
     ('m0001', '27/03/2017', 8), 
     ('m0001', '28/03/2017', 3.5), 
     ('m0002', '28/03/2017', 8), 
     ('m0003', '26/03/2017', 12), 
     ('M0001', '27/03/2017', 2) 
    ; 

    SELECT ID,ISNULL([26/03/2017],0)+ISNULL([27/03/2017],0)+ISNULL([28/03/2017],0) AS [SUM(DGLV)], 
ISNULL([26/03/2017],0)'26 (26/03/2017)',ISNULL([27/03/2017],0)'27 (27/03/2017)',ISNULL([28/03/2017],0)'28 (28/03/2017)' 
FROM 
(
    SELECT * 
    FROM #TABLE1 
) SRC 
PIVOT 
(
    SUM(SGLV) 
    FOR NLV IN ([26/03/2017], [27/03/2017],[28/03/2017]) 
) PIV; 
1

Essayez ceci peut vous aider à

select * into #temp from (

select 'm0001'ID, '27/03/2017' as NLV ,8 SGLV 
union all 
select 'm0001', '28/03/2017', 3.5 
union all 
select 'm0002 ', '28/03/2017' , 8 
union all 
select 'm0003 ','26/03/2017' ,12 
union all 
select 'M0001 ','27/03/2017' , 2 
) as a 


;with cte as (
select ID,isnull([27/03/2017],0)as [27/03/2017],isnull([28/03/2017],0)as [28/03/2017],isnull([26/03/2017],0) as [26/03/2017] from(
select * from #temp 
) as a 
pivot 
(
max(sglv) for nlv in ([27/03/2017],[28/03/2017],[26/03/2017]) 
) 
as a 
) 
select id,[27/03/2017]+[28/03/2017]+[26/03/2017] as SUM_SGLV,[27/03/2017],[28/03/2017],[26/03/2017] from cte