2017-11-18 23 views
3

我有一个表,我想分开数据到多列,我怎么能做到这一点?如何分隔一列到两个案例

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 
+0

您使用的两个表Transaction_Hdr和Transaction_dtl? –

回答

0

如下使用CASE()Modulus,假定Batch总是由1 inceremnted和Doc_Type始终这两个值AA并以相同的顺序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; 

个结果:

+----------+-------+------------+-------------+ 
| Doc_Type | Batch | Soaking_In | Soaking_Out | 
+----------+-------+------------+-------------+ 
| AA  |  1 |  20,50 |  0,00 | 
| BB  |  2 |  0,00 |  10,00 | 
| AA  |  3 |  6,00 |  0,00 | 
| BB  |  4 |  0,00 |  7,00 | 
| AA  |  5 |  8,00 |  0,00 | 
+----------+-------+------------+-------------+ 

Demo

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 
+0

你为什么要转换成“真实”? – HoneyBadger

+0

I将它转换为实数,因为给定的输出包含decimal和int两者。所以我认为真实对两者都是最好的。 –

1

我认为你正在寻找的结果表的数量,所以,你应该使用,而不是字符串的“浸泡在”和“浸出”如下

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 
2

你原来的查询将输出需要在那些字符串“浸泡在”或“浸出”,但什么(在then之后)是列[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” =“头”和“d” =“细节”,因为我真的不热衷依赖于内的序列别名该查询(因为该序列可能非常容易混淆)。我发现别名可以通过“表名中每个单词的第一个字母”或类似词来轻松识别其关联表。

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

相关问题