2017-11-18 65 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

相關問題