下午好,
下面的SQL为每个pr_codenum返回多行。期望的结果是每行一行。我尝试使用GROUP BY而不对结果进行任何更改。列P01,P02等是设施位置,如果它们不使用特定的pr_codenum,它们将具有真,假或空白。最终将有20列。非常感谢任何指导。 谢谢 GQ
SELECT ROW_NUMBER() OVER(ORDER BY wa_name) AS RowID, wa_id
INTO #LOC
FROM "SomeTable"
WHERE IsUsingTable = 1
SELECT DISTINCT pr_codenum, pr_descrip,
CASE WHEN RowID = 1 THEN HazMatFlag ELSE '' END AS P01,
CASE WHEN RowID = 2 THEN HazMatFlag ELSE '' END AS P02,
CASE WHEN RowID = 3 THEN HazMatFlag ELSE '' END AS P03,
CASE WHEN RowID = 4 THEN HazMatFlag ELSE '' END AS P04,
CASE WHEN RowID = 5 THEN HazMatFlag ELSE '' END AS P05,
CASE WHEN RowID = 6 THEN HazMatFlag ELSE '' END AS P06,
CASE WHEN RowID = 7 THEN HazMatFlag ELSE '' END AS P07,
CASE WHEN RowID = 8 THEN HazMatFlag ELSE '' END AS P08,
CASE WHEN RowID = 9 THEN HazMatFlag ELSE '' END AS P09,
CASE WHEN RowID = 10 THEN HazMatFlag ELSE '' END AS P010,
CASE WHEN RowID = 11 THEN HazMatFlag ELSE '' END AS P011,
CASE WHEN RowID = 12 THEN HazMatFlag ELSE '' END AS P012,
CASE WHEN RowID = 13 THEN HazMatFlag ELSE '' END AS P013,
CASE WHEN RowID = 14 THEN HazMatFlag ELSE '' END AS P014
FROM (
SELECT RowID, pr_codenum, pr_descrip, CASE WHEN p3_hazflag = 1 THEN
'True' ELSE 'False' END AS HazMatFlag
FROM "SomeTable"
INNER JOIN "AnotherTable" ON p3_prid = pr_id
INNER JOIN "DifferentTable" ON wa_id = p3_waid
LEFT JOIN #LOC l ON l.wa_id = p3_waid
WHERE pr_id IN (
SELECT DISTINCT p3_prid FROM "YetAnotherTable"
INNER JOIN "Table" ON pr_id = p3_prid AND pr_active = 1
WHERE p3_hazflag = 0 AND p3_prid IN (
SELECT DISTINCT p3_prid FROM "YetAnotherTable"
INNER JOIN "Table" ON pr_id = p3_prid AND pr_active = 1
WHERE p3_hazflag = 1))
)g
GROUP BY pr_codenum, pr_descrip, RowID, HazMatFlag
ORDER BY pr_codenum
DROP TABLE #LOC
答案 0 :(得分:0)
我怀疑你想要聚合:
SELECT pr_codenum, pr_descrip,
MAX(CASE WHEN RowID = 1 THEN HazMatFlag ELSE '' END) AS P01,
MAX(CASE WHEN RowID = 2 THEN HazMatFlag ELSE '' END) AS P02,
. . .
FROM . . .
GROUP BY pr_codenum, pr_descrip
ORDER BY pr_codenum
答案 1 :(得分:0)
问题是你将每个不同的行号分成它自己的列,因为每一行都有一个不同列的值,你的distinct会返回每一行。
我把你的P柱包裹成最大值。如果一行包含一个hazmatflag,则max应选择该行而不是''并且您的group by应该允许它聚合到pr_codenum,pr_descrip。当然,这假设您的hazmatflag值大于空字符串,并且您的描述值对于相同值的codenum是相同的。
SELECT RowID = ROW_NUMBER() OVER (ORDER BY wa_name),
wa_id
INTO #LOC
FROM "SomeTable"
WHERE IsUsingTable = 1
;
SELECT pr_codenum,
pr_descrip,
P01 = MAX( CASE WHEN g.RowID = 1 THEN g.HazMatFlag ELSE '' END ),
P02 = MAX( CASE WHEN g.RowID = 2 THEN g.HazMatFlag ELSE '' END ),
P03 = MAX( CASE WHEN g.RowID = 3 THEN g.HazMatFlag ELSE '' END ),
P04 = MAX( CASE WHEN g.RowID = 4 THEN g.HazMatFlag ELSE '' END ),
P05 = MAX( CASE WHEN g.RowID = 5 THEN g.HazMatFlag ELSE '' END ),
P06 = MAX( CASE WHEN g.RowID = 6 THEN g.HazMatFlag ELSE '' END ),
P07 = MAX( CASE WHEN g.RowID = 7 THEN g.HazMatFlag ELSE '' END ),
P08 = MAX( CASE WHEN g.RowID = 8 THEN g.HazMatFlag ELSE '' END ),
P09 = MAX( CASE WHEN g.RowID = 9 THEN g.HazMatFlag ELSE '' END ),
P010 = MAX( CASE WHEN g.RowID = 10 THEN g.HazMatFlag ELSE '' END ),
P011 = MAX( CASE WHEN g.RowID = 11 THEN g.HazMatFlag ELSE '' END ),
P012 = MAX( CASE WHEN g.RowID = 12 THEN g.HazMatFlag ELSE '' END ),
P013 = MAX( CASE WHEN g.RowID = 13 THEN g.HazMatFlag ELSE '' END ),
P014 = MAX( CASE WHEN g.RowID = 14 THEN g.HazMatFlag ELSE '' END )
FROM
( SELECT l.RowID,
pr_codenum,
pr_descrip,
HazMatFlag = CASE WHEN p3_hazflag = 1 THEN 'True' ELSE 'False' END
FROM "SomeTable"
INNER JOIN "AnotherTable"
ON p3_prid = pr_id
INNER JOIN "DifferentTable"
ON wa_id = p3_waid
LEFT JOIN #LOC AS l
ON l.wa_id = p3_waid
WHERE pr_id IN ( SELECT DISTINCT
p3_prid
FROM "YetAnotherTable"
INNER JOIN "Table"
ON pr_id = p3_prid
AND pr_active = 1
WHERE p3_hazflag = 0
AND p3_prid IN ( SELECT DISTINCT
p3_prid
FROM "YetAnotherTable"
INNER JOIN "Table"
ON pr_id = p3_prid
AND pr_active = 1
WHERE p3_hazflag = 1 ))) AS g
GROUP BY pr_codenum,
pr_descrip
ORDER BY pr_codenum
;
DROP TABLE #LOC
;