這是類似的問題: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'))
GROUP BY,具有集合函數MAX,MIN,SUM等...... – Ben 2012-04-24 12:36:54