2011-04-28 134 views
1

我是這方面的新手,這也不是我的數據。我們正試圖將多個記錄放入一個查詢結果記錄中。SQL如果滿足條件,則將多行查詢到一個條目

爲了簡化數據的表和量,下面的兩個表應該是足夠的:

表1

PRVDR_NUM | RPT_REC_NUM 
013   1234 
014   4567 

表2

RPT_REC_NUM | WKSHT_CD | LINE_NUM | ITM_VAL_NUM 
1234    f1   3   30 
1234    f1   9   3 
1234    e2  100   100 
4567    f1   3   20 
4567    f1   9   8 
4567    e2  100   100 

第一部分是獲得所有記錄WKSHT_CD f1和LINE_NUM 3的ITM_NUM_CAL介於25和50之間,ITM_NUM_VAL是收入。

SELECT  r.PRVDR_NUM as Provider, 
      r.RPT_REC_NUM as 'Report Record', 
      n.ITM_VAL_NUM as Revenue 

FROM  Table 1 r 
     left outer join Table 2 n on 
     r.RPT_REC_NUM = n.RPT_REC_NUM 

WHERE (n.WKSHT_CD = 'f1') and (n.LINE_NUM = '3') 
     and (n.ITM_VAL_NUM > 25) and (n.ITM_VAL_NUM < 50) 
     and left(r.PRVDR_NUM, 2) in ('01','04','11','18','25','26','34','44','49') 

所以我們的結果是:

Provider | Report Record | Revenue 
013   1234   30  

但是,我們也希望能夠拉動相應ITM_VAL_NUM爲WKSHT_CD f1和LINE_NUM 9,我們稱之爲成本。

所以結果應該是:

Provider | Report Record | Revenue | Cost 
013   1234   30   3 

提前很多感謝。

編輯

我相信這是我一直在尋找最終的查詢後,一些機動和增加了一個新的變量,CLMN_NUM,這是表2中另一列。

SELECT r.PRVDR_NUM as Provider, 
     r.RPT_REC_NUM as 'Report Record', 
     n.ITM_VAL_NUM as Revenue, 
     n2.ITM_VAL_NUM as 'Cost', 
     n3.ITM_VAL_NUM as 'Visits' 

FROM table1 r 
    LEFT OUTER JOIN table2 n on r.RPT_REC_NUM = n.RPT_REC_NUM 
    LEFT OUTER JOIN table2 n2 on n.WKSHT_CD = n2.WKSHT_CD 
    and n.RPT_REC_NUM = n2.RPT_REC_NUM and n2.LINE_NUM = 9 
    LEFT OUTER JOIN table2 n3 on r.RPT_REC_NUM = n3.RPT_REC_NUM 
    and n3.WKSHT_CD = 'e2' and n3.LINE_NUM = 100 and n3.CLMN_NUM = xxxx 

WHERE (n.WKSHT_CD = 'f1') 
AND (n.LINE_NUM = '3') 
AND (n.ITM_VAL_NUM > 25) 
AND (n.ITM_VAL_NUM < 50) 
AND left(r.PRVDR_NUM, 2) in ('01','04','11','18','25','26','34','44','49') 

回答

0

幾種方法:

子查詢

SELECT r.PRVDR_NUM as Provider, 
     r.RPT_REC_NUM as 'Report Record', 
     n.ITM_VAL_NUM as Revenue 
     (SELECT ITM_VAL_NUM 
     FROM Table2 
     WHERE WKSHT_CD = n.WKSHT_CD 
     AND LINE_NUM = 9) AS Cost 
FROM Table1 r 
    LEFT OUTER JOIN Table2 n on r.RPT_REC_NUM = n.RPT_REC_NUM 
WHERE (n.WKSHT_CD = 'f1') 
AND (n.LINE_NUM = '3') 
AND (n.ITM_VAL_NUM > 25) 
AND (n.ITM_VAL_NUM < 50) 
AND left(r.PRVDR_NUM, 2) in ('01','04','11','18','25','26','34','44','49') 

另一個JOIN

SELECT r.PRVDR_NUM as Provider, 
     r.RPT_REC_NUM as 'Report Record', 
     n.ITM_VAL_NUM as Revenue 
     n2.Cost 
FROM Table1 r 
    LEFT OUTER JOIN Table2 n on r.RPT_REC_NUM = n.RPT_REC_NUM 
    LEFT OUTER JOIN Table2 n2 on n.WKSHT_CD = n2.WKSHT_CD 
     AND LINE_NUM = 9 
WHERE (n.WKSHT_CD = 'f1') 
AND (n.LINE_NUM = '3') 
AND (n.ITM_VAL_NUM > 25) 
AND (n.ITM_VAL_NUM < 50) 
AND left(r.PRVDR_NUM, 2) in ('01','04','11','18','25','26','34','44','49') 
+0

謝謝你的快速反應,當我嘗試你的子查詢解決方案,我得到一個消息超過1倍的值。當我嘗試一些修改後的JOIN解決方案時,我得到它的工作,但最終的方式太多行,好像它拉動了所有的成本。 – Frank 2011-04-28 17:07:23

+0

在這兩方面都是因爲數據,我假設你只提供一個抽樣。您需要添加條件以確保只有1條記錄能夠返回。 – 2011-04-28 17:08:53

+0

感謝您的幫助達斯汀,我編輯了一些修改和補充我的文章,這似乎是好嗎? – Frank 2011-04-28 19:20:16

0

你可以做一個CASE/WHEN對有問題的列,但允許兩個值LINE_NUM在您的位置...使用COALESCE將防止NULL值,如果一方沒有記錄,另一方或兩者分別記錄收入/成本。您可以對您希望包含的任何其他「LINE_NUM」值使用相同的考慮因素。

SELECT 
     r.PRVDR_NUM as Provider, 
     r.RPT_REC_NUM as 'Report Record', 
     COALESCE(CASE WHEN n.LINE_NUM = 3 THEN n.ITM_VAL_NUM ELSE 0 END, 0) as Revenue, 
     COALESCE(CASE WHEN n.LINE_NUM = 9 THEN n.ITM_VAL_NUM ELSE 0 END, 0) as Costs 
    from 
     Table_1 r 
     left join Table_2 n 
      on r.RPT_REC_NUM = n.RPT_REC_NUM 
      AND n.WKSHT_CD = 'f1' 
      AND n.LINE_NUM in ('3', '9') 
      AND n.ITM_VAL_NUM between 25 and 50 
    where 
     left(r.PRVDR_NUM, 2) in ('01','04','11','18','25','26','34','44','49') 
+0

我試過這個,並嘗試了一些修改,但每次都在這兩個字段中都帶有零。 – Frank 2011-04-28 17:11:00

0
SELECT 
    Provider  = r.PRVDR_NUM, 
    [Report Record] = r.RPT_REC_NUM, 
    Revenue   = MIN(CASE n.LINE_NUM WHEN '3' THEN n.ITM_VAL_NUM), 
    Cost   = MIN(CASE n.LINE_NUM WHEN '9' THEN n.ITM_VAL_NUM) 
FROM Table1 r 
    INNER JOIN Table2 n ON r.RPT_REC_NUM = n.RPT_REC_NUM 
WHERE n.WKSHT_CD = 'f1' AND n.LINE_NUM IN ('3', '9') 
    AND n.ITM_VAL_NUM > 25 AND n.ITM_VAL_NUM < 50 
    AND LEFT(r.PRVDR_NUM, 2) IN ('01','04','11','18','25','26','34','44','49') 
GROUP BY 
    r.PRVDR_NUM, 
    r.RPT_REC_NUM 
相關問題