如何将一列与两列

时间:2017-11-18 00:22:19

标签: sql sql-server

我有一个表,我想将数据分成多列,我该怎么做?

enter image description here

我试过了:

 select a.[batch],a.[Doc_Type],
    Soaking Out =  
      CASE a.[Doc_Type]   
         WHEN 'BB' THEN 'Soaking Out'  
      END,

        Soaking In =  
      CASE a.[Doc_Type]  
         WHEN 'AA' THEN 'Soaking In'    
      END,

     FROM Transaction_Hdr a JOIN Transaction_dtl b
on a.Doc_Number=b.Doc_Number

5 个答案:

答案 0 :(得分:2)

您的原始查询会输出字符串'浸泡'或'浸泡',但那些case expressionsthen之后)需要的是列[Qty],它是该值将从case expression返回。

我不知道哪个表[Qty]来自哪个,但我认为它是详细信息表(b),否则加入该详细信息表没有多大意义。

SELECT
      a.[Doc_Type]
    , a.[batch]
    , CASE a.[Doc_Type] WHEN 'BB' THEN b.Qty END [soaking out]
    , CASE a.[Doc_Type] WHEN 'AA' THEN b.Qty END [soaking in]
FROM Transaction_Hdr a
JOIN Transaction_dtl b ON a.Doc_Number = b.Doc_Number
ORDER BY 
      a.[Doc_Type]
    , a.[batch]

但是:“详细信息”表和“标题”表通常表示单个标题的许多细节行。因此,您可能需要SUM()GROUP BY

SELECT
      h.[Doc_Type]
    , h.[batch]
    , SUM(CASE h.[Doc_Type] WHEN 'BB' THEN d.Qty END) [soaking out]
    , SUM(CASE h.[Doc_Type] WHEN 'AA' THEN d.Qty END) [soaking in]
FROM Transaction_Hdr h
JOIN Transaction_dtl d ON h.Doc_Number = d.Doc_Number
GROUP BY
      h.[Doc_Type]
    , h.[batch]
ORDER BY 
      h.[Doc_Type]
    , h.[batch]

注意我现在使用了别名“h”=“header”和“d”=“detail”,因为我真的不热衷于依赖查询中的序列的别名(因为该序列很容易搞乱) )。我发现别名更容易通过“表名中每个单词的首字母”或类似名称轻松识别其关联表。

答案 1 :(得分:1)

select a.[batch],a.[Doc_Type],
        isnull(CASE   WHEN a.[Doc_Type]='AA' THEN convert(real,a.Qty)  END,0) as [Soaking In] ,
        isnull(CASE  WHEN a.[Doc_Type]='BB' THEN convert(real,a.Qty) END ,0)as [Soaking Out] 
FROM Transaction_Hdr a 

答案 2 :(得分:1)

我认为你在结果表中寻找数量,所以你应该使用它而不是字符串'Soaking In'和'Soaking Out'如下

select a.[batch],a.[Doc_Type],
SoakingOut =  
  CASE a.[Doc_Type]   
     WHEN 'BB' THEN Qty 
  END    ,

    SoakingIn =  
  CASE a.[Doc_Type]  
     WHEN 'AA' THEN Qty    
  END

 FROM #temp a 

答案 3 :(得分:1)

BEGIN TRAN


CREATE TABLE #Data (
    Doc_Type VARCHAR(10),
    Batch INT,
    Qty DECIMAL(4,2)
    );
INSERT INTO #Data VALUES
('AA', 1, 20.5),
('BB', 2, 10  ),
('AA', 3, 6   ),
('BB', 4, 7   ),
('AA', 5, 8   );

SELECT ISNULL(CASE WHEN Doc_Type='AA'THEN CONVERT(NVARCHAR(10),QTY) END,'') Soaking_In , 
ISNULL(CASE WHEN Doc_Type='BB'THEN CONVERT(NVARCHAR(10),QTY) END,'')  Soaking_Out
FROM #Data


ROLLBACK TRAN

enter image description here

答案 4 :(得分:0)

如下所示使用CASE()Modulus,假设Batch总是被1提取,而Doc_Type始终包含AA和{{1}以相同的顺序:

BB

结果:

CREATE TABLE Data (
    Doc_Type VARCHAR(10),
    Batch INT,
    Qty DECIMAL(4,2)
    );
INSERT INTO Data VALUES
('AA', 1, 20.5),
('BB', 2, 10  ),
('AA', 3, 6   ),
('BB', 4, 7   ),
('AA', 5, 8   );

SELECT D.Doc_Type, D.Batch, 
       CASE WHEN D.Batch % 2 = 0 Then 0 ELSE D.Qty END AS Soaking_In, 
       CASE WHEN D.Batch % 2 = 1 Then 0 ELSE D.Qty END AS Soaking_Out
FROM Data D;

<强> Demo