我有一个表,我想将数据分成多列,我该怎么做?
我试过了:
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 :(得分:2)
您的原始查询会输出字符串'浸泡'或'浸泡',但那些case expressions
(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”=“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
答案 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 强>