टॉप रिटर्निंग अशक्त

वोट
1

मैं नीचे निम्नलिखित दृष्टिकोण है। जब मैं टॉप (1) खंड का उपयोग दूसरे नेस्टेड का चयन हमेशा अशक्त लौट रहा है, लेकिन जब मैं इस खंड को दूर यह डेटा के रूप में उम्मीद की तुलना में की जरूरत है सिर्फ अधिक पंक्तियाँ देता है। किसी को भी कुछ भी है कि इस की व्याख्या करता है देखना है?

    SELECT TOP (100) PERCENT
    a.ITEMID AS Model
   ,id.CONFIGID
   ,id.INVENTSITEID AS SiteId
   ,id.INVENTSERIALID AS Serial
   ,it.ITEMNAME AS Description
   ,CASE WHEN it.DIMGROUPID LIKE '%LR-Y' THEN 'Y'
         ELSE 'N'
    END AS SerialNumberReqd
   ,ISNULL(it.PRIMARYVENDORID, N'') AS Vendor
   ,ISNULL(vt.NAME, N'') AS VendorName
   ,id.INVENTLOCATIONID AS Warehouse
   ,id.WMSLOCATIONID AS Bin
   ,ISNULL(CONVERT(varchar(12), CASE WHEN C.DatePhysical < '1901-01-01'
                                     THEN NULL
                                     ELSE C.DatePhysical
                                END, 101), N' ') AS DeliveryDate
   ,CASE WHEN (a.RESERVPHYSICAL > 0
               OR C.StatusIssue = 1)
              AND c.TransType = 0 THEN C.PONumber
         ELSE ''
    END AS SoNumber
   ,'' AS SoDetail
   ,ISNULL(C.PONumber, N'') AS RefNumber
   ,ISNULL(CONVERT(varchar(12), CASE WHEN ins.ProdDate < '1901-01-01'
                                     THEN NULL
                                     ELSE ins.PRODDATE
                                END, 101), N' ') AS DateReceived
   ,it.STKSTORISGROUPID AS ProdGroup
   ,ISNULL(CONVERT(varchar(12), CASE WHEN ins.ProdDate < '1901-01-01'
                                     THEN NULL
                                     ELSE ins.PRODDATE
                                END, 101), N' ') AS ProductionDate
   ,it.ITEMGROUPID
   ,it.STKSTORISGROUPID AS MerchandisingGroup
   ,CASE WHEN a.postedValue = 0
         THEN (CASE WHEN D.CostAmtPosted = 0 THEN D.CostAmtPhysical
                    ELSE D.CostAmtPosted
               END)
         ELSE a.POSTEDVALUE
    END AS Cost
   ,CASE WHEN a.PHYSICALINVENT = 0 THEN a.Picked
         ELSE a.PhysicalInvent
    END AS PhysicalOnHand
   ,ins.STKRUGSQFT AS RugSqFt
   ,ins.STKRUGVENDSERIAL AS RugVendSerial
   ,ins.STKRUGVENDDESIGN AS RugVendDesign
   ,ins.STKRUGEXACTSIZE AS RugExactSize
   ,ins.STKRUGCOUNTRYOFORIGIN AS RugCountryOfOrigin
   ,ins.STKRUGQUALITYID AS RugQualityId
   ,ins.STKRUGCOLORID AS RugColorId
   ,ins.STKRUGDESIGNID AS RugDesignId
   ,ins.STKRUGSHAPEID AS RugShapeId
   ,CASE WHEN (a.AVAILPHYSICAL > 0) THEN 'Available'
         WHEN (id.WMSLOCATIONID = 'NIL') THEN 'Nil'
         WHEN (a.RESERVPHYSICAL > 0)
              AND (c.TransType = 0) THEN 'Committed'
         WHEN (a.RESERVPHYSICAL > 0) THEN 'Reserved'
         WHEN (id.WMSLOCATIONID LIKE '%-Q') THEN 'Damaged'
         WHEN (a.Picked > 0) THEN 'Picked'
         ELSE 'UNKNOWN'
    END AS Status
   ,'' AS ReasonCode
   ,'' AS BaseModel
   ,ISNULL(CAST(ins.STKSTORISCONFIGINFO AS nvarchar(1000)), N'') AS StorisConfigInfo
   ,ISNULL(C.ConfigSummary, N'') AS ConfigSummary
FROM
    dbo.INVENTSUM AS a WITH (NOLOCK)
INNER JOIN dbo.INVENTDIM AS id WITH (NOLOCK)
    ON id.DATAAREAID = a.DATAAREAID
       AND id.INVENTDIMID = a.INVENTDIMID
LEFT OUTER JOIN dbo.INVENTTABLE AS it WITH (NOLOCK)
    ON it.DATAAREAID = a.DATAAREAID
       AND it.ITEMID = a.ITEMID
LEFT OUTER JOIN dbo.VENDTABLE AS vt WITH (NOLOCK)
    ON vt.DATAAREAID = it.DATAAREAID
       AND vt.ACCOUNTNUM = it.PRIMARYVENDORID
LEFT OUTER JOIN dbo.INVENTSERIAL AS ins WITH (NOLOCK)
    ON ins.DATAAREAID = id.DATAAREAID
       AND ins.INVENTSERIALID = id.INVENTSERIALID
LEFT OUTER JOIN (SELECT TOP (1)
                    itt.ITEMID
                   ,invt.INVENTSERIALID
                   ,itt.DATEPHYSICAL AS DatePhysical
                   ,itt.TRANSREFID AS PONumber
                   ,itt.TRANSTYPE AS TransType
                   ,itt.STATUSISSUE AS StatusIssue
                   ,dbo.stkRowsToColumn(itt.INVENTTRANSID, 'STI') AS ConfigSummary
                   ,itt.RECID
                 FROM
                    dbo.INVENTTRANS AS itt WITH (NOLOCK)
                 INNER JOIN dbo.INVENTDIM AS invt WITH (NOLOCK)
                    ON invt.DATAAREAID = itt.DATAAREAID
                       AND invt.INVENTDIMID = itt.INVENTDIMID
                 WHERE
                    (itt.DATAAREAID = 'STI')
                    AND (itt.TRANSTYPE IN (0, 2, 3, 8))
                    AND (invt.INVENTSERIALID <> '')
                 ORDER BY
                    itt.RECID DESC) AS C
    ON C.ITEMID = a.ITEMID
       AND C.INVENTSERIALID = id.INVENTSERIALID
LEFT OUTER JOIN (SELECT TOP (1)
                    itt2.ITEMID
                   ,invt2.INVENTSERIALID
                   ,itt2.COSTAMOUNTPOSTED AS CostAmtPosted
                   ,itt2.COSTAMOUNTPHYSICAL + itt2.COSTAMOUNTADJUSTMENT AS CostAmtPhysical
                   ,itt2.RECID
                 FROM
                    dbo.INVENTTRANS AS itt2 WITH (NOLOCK)
                 INNER JOIN dbo.INVENTDIM AS invt2 WITH (NOLOCK)
                    ON invt2.DATAAREAID = itt2.DATAAREAID
                       AND invt2.INVENTDIMID = itt2.INVENTDIMID
                 WHERE
                    (itt2.DATAAREAID = 'STI')
                    AND (itt2.TRANSTYPE IN (0, 2, 3, 4, 6, 8))
                    AND (invt2.INVENTSERIALID <> '')
                 ORDER BY
                    itt2.RECID DESC) AS D
    ON D.ITEMID = a.ITEMID
       AND D.INVENTSERIALID = id.INVENTSERIALID
WHERE
    (a.DATAAREAID = 'STI')
    AND (a.CLOSED = 0)
    AND (a.PHYSICALINVENT > 0)
    AND (it.ITEMGROUPID LIKE 'FG-%'
         OR it.ITEMGROUPID = 'MULTISHIP')
ORDER BY
    SiteId
   ,Warehouse
30/01/2014 को 16:30
उपयोगकर्ता
अन्य भाषाओं में...                            


2 जवाब

वोट
2

मुमकिन है, सबक्वेरी में शीर्ष मूल्य बाद में पूरा नहीं करता joinकी स्थिति। यही कारण है, यह शर्त पूरी नहीं कर रहा है:

D.ITEMID = a.ITEMID AND D.INVENTSERIALID = id.INVENTSERIALID

आप एक प्रयोग कर रहे हैं left outer join, तो NULLमूल्यों में भर रहे हैं।

संपादित करें:

दोहराना। जब आप इसके साथ चलाने top 1, वहाँ कोई मान (दो चरों के कम से कम कुछ संयोजन के लिए) कर रहे हैं। तो, NULLइन मूल्यों के लिए में भर दिया जाएगा। सब के बाद, top 1(के साथ या कोष्ठकों के बिना) केवल एक पंक्ति देता है।

जब आप इसे एकाधिक पंक्तियों लौटने चलाने, शायद वहाँ मेल खाते हैं। मिलान खाने वाली पंक्तियाँ के लिए, संबंधित मानों डाल दिया जाता है। इस तरह से वह यह है कि left outer joinकाम करता है।

30/01/2014 को 16:47
का स्रोत उपयोगकर्ता

वोट
0

गॉर्डन के जवाब जब शीर्ष और कोई भी दूर करने जब मैं यह था कारण है कि मैं कुछ ऐसी पंक्तियां हो रही थी के रूप में सही है। सवाल में सबक्वेरी InventTrans तालिका (5 लाख +) में सभी पंक्तियों को लौट रहा था तो जब मैं शीर्ष इस्तेमाल किया, यह सिर्फ पहली पंक्ति जो कुछ भी नहीं था हो रही थी। मुझे एहसास हुआ कि इस मामले में जब मैं टॉप खंड में यादृच्छिक उच्च मूल्यों (जैसे 50000) कोशिश कर रहा था था।

परम ठीक बाईं बाहरी सी और डी सबक्वेरी पर मिलती लागू क्रॉस बदलने के लिए, और उसके बाद जहां खंड बदल बेहतर तालिका को फ़िल्टर करने के लिए करने के लिए (जैसे itt.itemid = a.itemid और invt1.inventserialid = id.inventserialid) था। कि का उपयोग करना, मैं अपेक्षा के अनुरूप टॉप 1 उपयोग करने के लिए कर रहा था।

07/02/2014 को 16:23
का स्रोत उपयोगकर्ता

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more