2012-04-24 39 views
3

這是類似的問題:TSQL select rows by one from 2 conditions,但它是在我想有結果不同TSQL選擇一個或多個行加入

我有一個表像這樣:

ORDER_ID CODE1 CODE2 CODE3 STATUS TYPE  SUM  GROUP 
1   '001' 'BIGP' NULL 4   'company' 120  48 
2   '002' 'BIGP' NULL 1   'priv'  100  20 
3   '001' NULL NULL 6   'priv'  50  49 
4   '002' NULL 'L'  1   'company' 1253  22 

和第二個表像這樣:

ADDRESS_ID ORDER_ID ZIP  TYPE ADD_DATE  CATEGORY  VERIFIED 
1   1   '15-125' 'K1' '2010-01-01' 'CLIENT'  1 
2   1   '22-022' 'D1' '2010-01-02' 'SYSTEM'  1 
3   2   '16-159' 'D2' '2010-01-02' 'SYSTEM'  1 
4   2   '15-125' 'D2' '2010-02-01' 'CLIENT'  0 

第三和第四表包含郵政編碼和城市的名字,像這樣:

ZIP  CITY 
'15-125' 'Warszawa' 
'22-022' 'Koszalin' 
'16-159' 'Krakow' 
'15-125' 'Lublin' 

對於具有

  • 狀態每順序不在 '002' 之間(4,6)
  • 代碼1和 '005'
  • (碼2 = null並且CODE3 = NULL)或(如果code1 ='002'AND group IN(48,59,60,code3 = null)或(code2 = NULL且code3 ='L')中的代碼2

如果code1 ='002' 87)我必須選擇一個地址
(非常感謝尼古拉馬爾科維諾VIC):

SELECT TOP 1000 o.order_Id 
       , a.Address_Id 
       , a.Zip 
      --, * 
FROM orders o 
CROSS APPLY 
(
select TOP 1 
     a.Address_Id, 
     a.Zip 
    from address a 
    WHERE a.order_Id = o.order_Id 
    ORDER BY case a.Type 
       when 'D2' then 1 
       when 'K1' then 2 
       else 3 
      end, 
     a.ADD_DATE 
) a 
WHERE 
o.Status NOT IN (4, 6) 
AND code1='002' 
AND group IN (48,59,60,87) 
AND ((code2 IS NULL AND code3 IS NULL) OR (code2 IN ('BIGA', 'BIGP') AND code3 IS NULL) OR (code2 IS NULL AND code3 = 'L')) 

對符合頂級標準,並得到了代碼1 =「002」 AND組NOT IN(48,59,60,87),我必須選擇的所有地址已經驗證了這些訂單中的所有其他訂單= 1

收集這些地址,我將能夠檢查一個特定的帖子公司可以提供我的郵件到這些地址後(我將檢查含郵政編碼另一個表)

我在想使工會所有,首先選擇並與第二個聯合,返回code1 ='002'和組NOT IN(48,59,60,87)的所有地址。

但也許有可能沒有工會都做到這一點?

這一點,最後的結果我想獲得:

CODE1  TYPE  COUNT_OF_ORDERS  COUNT_OF_ADDRESSES  COMPANY1 OTHER 
'001'  'NORMAL' 125     150     110  40 
'002'  'NORMAL' 100     122     100  22 
'003'  'NORMAL' 150     110     100  10 
'004'  'NORMAL' 200     220     220  0 
'005'  'NORMAL' 220     240     210  30 
'005'  'PRIORITY' 100     110     110  0 
'SX1'  'PRIORITY' 100     100     20  80 

所以,如果我喜歡的類型是「正常」我就要檢查一下是否該地址順序表中存在具有正常的郵政編碼,如果有型'優先'我必須在優先代碼表中檢查。

如果代碼存在於特定表格中,我向COMPANY1列添加+1,如果不是OTHER,則這些列的總和必須是我的地址的總和。


這是查詢,我已經成功地做到(與@NikolaMarkovinović的幫助)

SELECT TOP 1000 o.order_Id 
       , a.Address_Id 
       , a.Zip 
      --, * 
FROM orders o 
CROSS APPLY 
(
select TOP 1 
     a.Address_Id, 
     a.Zip 
    from address a 
    WHERE a.order_Id = o.order_Id 
    AND code1='002' 
    AND o.[group] IN (48,59,60,87) 
    ORDER BY case a.Type 
       when 'D2' then 1 
       when 'K1' then 2 
       else 3 
      end, 
     a.ADD_DATE 
    UNION ALL 
select 
     a.Address_Id, 
     a.Zip 
    from address a 
    WHERE a.order_Id = o.order_Id 
    AND ((code1='002' AND o.[group] NOT IN (48,59,60,87)) OR code1 IN ('001', '003', '004', '005')) 
    --I'm not shure of that top line, it work's but mayby it con de written better 
    AND Verified = 1 
) a 
WHERE 
o.Status NOT IN (4, 6) 
AND ((code2 IS NULL AND code3 IS NULL) 
    OR (code2 IN ('BIGA', 'BIGP') AND code3 IS NULL) 
    OR (code2 IS NULL AND code3 = 'L')) 
+0

GROUP BY,具有集合函數MAX,MIN,SUM等...... – Ben 2012-04-24 12:36:54

回答

1

你可能很容易過濾地址([group] IN (48,59,60,87) OR Verified = 1),但調整TOP 1會使事情荒謬(TOP (case when [group] IN (48,59,60,87) then 1 else (select count(*) from addresses where order_Id = o.order_Id) end)所以我建議你做union all但只有不會忽略:

SELECT TOP 1000 o.order_Id 
       , a.Address_Id 
       , a.Zip 
      --, * 
FROM orders o 
CROSS APPLY 
(
select TOP 1 
     a.Address_Id, 
     a.Zip 
    from address a 
    WHERE a.order_Id = o.order_Id 
    AND o.[group] IN (48,59,60,87) 
    ORDER BY case a.Type 
       when 'D2' then 1 
       when 'K1' then 2 
       else 3 
      end, 
     a.ADD_DATE 
    UNION ALL 
select 
     a.Address_Id, 
     a.Zip 
    from address a 
    WHERE a.order_Id = o.order_Id 
    AND o.[group] NOT IN (48,59,60,87) 
    AND Verified = 1 
) a 
WHERE 
o.Status NOT IN (4, 6) 
AND code1='002' 
AND ((code2 IS NULL AND code3 IS NULL) 
    OR (code2 IN ('BIGA', 'BIGP') AND code3 IS NULL) 
    OR (code2 IS NULL AND code3 = 'L')) 

PS如果順序可能沒有地址替換CROSS與OUT APPLY ER適用。

+0

這是一個有趣的方式,但是當我在寫我的問題時,我必須選擇001和005之間的code1的所有順序,但當code1 ='002'和group in(48,59,60,87)時,我只能選擇一個地址,在所有其他情況下,我必須選擇已驗證= 1的所有地址。所以可能會出現這樣的情況,即訂單有code1 = 002,但是它有另一個組(48,59,60,87),所以對於該訂單,我必須採取所有經過驗證的地址。我會盡力調整你的查詢併發布:) – Misiu 2012-04-25 06:13:10

+0

@Misiu太好了,謝謝。我的思想無法消化所有'codex在複雜條件下爲空或代碼性狀態,所以我只是將它們留在原來的位置,並集中在地址檢索問題上。昨天是漫長的一天:-) – 2012-04-25 07:43:45

+0

再次謝謝你:)你真的有技能,希望有一天我會擁有如此的技能:) – Misiu 2012-04-25 08:12:07