使用不同的条件调用两次列

时间:2014-05-22 16:43:51

标签: sql sql-server join union

我非常感谢有关这件事的任何帮助:) 我正在撰写报告,我遇到了一些麻烦 我有这个查询,它工作正常,现在我想添加一个已经存在于查询中的coulmn(来自同一个表),但这次我将改变它的条件,BTW两者的条件第2列基于另一列 例如,如果我有这个:

Select Price from ITM1 WHERE PriceList = '1'

还有这个

Select Price from ITM1 WHERE PriceList = '10'

我如何在同一个查询中编写并让它们显示在两个不同的列中? 如果有人可以帮我解决问题,我会把查询放在这里以防万一: 你可以看到The Column Price& PriceList在它的下半部分,Bolded。 我只需要再次制作相同的东西,但有一个新的库尔特名称。

2 个答案:

答案 0 :(得分:1)

使用IN Operator会为您提供所需内容。但是,您可以对查询进行其他更改以提高性能 - 但这超出了问题的范围。我不清楚你要用不同的“专栏”做什么请帮忙解释一下。 另见@ Dave.Gugg的回答就是这样。

SELECT T0.ItemCode,
    T0.ItemName,
    T0.CardCode,
    T0.CodeBars,
    T2.UgpCode,
    T3.AltQty,
    T3.BaseQty,
    CASE 
        WHEN T4.Uomentry = - 1
            THEN T0.[BuyUnitMsr]
        ELSE t4.UomName
    END AS 'UoMName',
    T4.UomEntry,
    T0.U_CAT_CODE,
    T0.U_CAT_NAME,
    T1.CardName,
    (
        SELECT TOP (1) dbo.PDN1.U_AC_QTY_ORDER
        FROM dbo.PDN1
        INNER JOIN dbo.OPDN ON dbo.PDN1.DocEntry = dbo.OPDN.DocEntry
        WHERE (dbo.PDN1.ItemCode = T0.ItemCode)
            AND (dbo.OPDN.CardCode = T0.CardCode)
        ORDER BY dbo.OPDN.DocDate DESC
        ) AS OQuantity,
    (
        SELECT TOP (1) PDN1_1.U_AC_QTY_BONUS
        FROM dbo.PDN1 AS PDN1_1
        INNER JOIN dbo.OPDN AS OPDN_1 ON PDN1_1.DocEntry = OPDN_1.DocEntry
        WHERE (PDN1_1.ItemCode = T0.ItemCode)
            AND (OPDN_1.CardCode = T0.CardCode)
        ORDER BY OPDN_1.DocDate DESC
        ) AS BQuantity,
    ITM1.Price,
    T0.U_DISC_PER
FROM dbo.OITM AS T0
INNER JOIN dbo.OCRD AS T1 ON T0.CardCode = T1.CardCode
INNER JOIN dbo.OUGP AS T2 ON T0.UgpEntry = T2.UgpEntry
INNER JOIN dbo.UGP1 AS T3 ON T2.UgpEntry = T3.UgpEntry
INNER JOIN dbo.ITM1 ON T0.ItemCode = dbo.ITM1.ItemCode
    AND dbo.ITM1.PriceList IN ('1', '10')
LEFT JOIN dbo.OUOM AS T4 ON T3.UomEntry = T4.UomEntry
WHERE (T0.Series = '65')
    AND (
        T4.UomEntry = 3
        OR T4.UomEntry = '-1'
        )

<小时/> 如果你想要一个不同的列(这可能比两个连接更好):

SELECT T0.ItemCode,
    T0.ItemName,
    T0.CardCode,
    T0.CodeBars,
    T2.UgpCode,
    T3.AltQty,
    T3.BaseQty,
    CASE 
        WHEN T4.Uomentry = - 1
            THEN T0.[BuyUnitMsr]
        ELSE t4.UomName
    END AS 'UoMName',
    T4.UomEntry,
    T0.U_CAT_CODE,
    T0.U_CAT_NAME,
    T1.CardName,
    (
        SELECT TOP (1) dbo.PDN1.U_AC_QTY_ORDER
        FROM dbo.PDN1
        INNER JOIN dbo.OPDN ON dbo.PDN1.DocEntry = dbo.OPDN.DocEntry
        WHERE (dbo.PDN1.ItemCode = T0.ItemCode)
            AND (dbo.OPDN.CardCode = T0.CardCode)
        ORDER BY dbo.OPDN.DocDate DESC
        ) AS OQuantity,
    (
        SELECT TOP (1) PDN1_1.U_AC_QTY_BONUS
        FROM dbo.PDN1 AS PDN1_1
        INNER JOIN dbo.OPDN AS OPDN_1 ON PDN1_1.DocEntry = OPDN_1.DocEntry
        WHERE (PDN1_1.ItemCode = T0.ItemCode)
            AND (OPDN_1.CardCode = T0.CardCode)
        ORDER BY OPDN_1.DocDate DESC
        ) AS BQuantity,
    CASE 
        WHEN ITM1.PriceList = '1' 
            THEN ITM1.Price
        ELSE '0'
    END AS Price1, 
    CASE 
        WHEN ITM1.PriceList = '10' 
            THEN ITM1.Price
        ELSE '0'
    END AS Price2, 
    T0.U_DISC_PER
FROM dbo.OITM AS T0
INNER JOIN dbo.OCRD AS T1 ON T0.CardCode = T1.CardCode
INNER JOIN dbo.OUGP AS T2 ON T0.UgpEntry = T2.UgpEntry
INNER JOIN dbo.UGP1 AS T3 ON T2.UgpEntry = T3.UgpEntry
INNER JOIN dbo.ITM1 ON T0.ItemCode = dbo.ITM1.ItemCode
    AND dbo.ITM1.PriceList IN ('1', '10')
LEFT JOIN dbo.OUOM AS T4 ON T3.UomEntry = T4.UomEntry
WHERE (T0.Series = '65')
    AND (
        T4.UomEntry = 3
        OR T4.UomEntry = '-1'
        )

答案 1 :(得分:0)

你应该能够第二次加入这个表,但是你需要在外面加入联接:

SELECT  T0.ItemCode ,
        T0.ItemName ,
        T0.CardCode ,
        T0.CodeBars ,
        T2.UgpCode ,
        T3.AltQty ,
        T3.BaseQty ,
        CASE WHEN T4.Uomentry = -1 THEN T0.[BuyUnitMsr]
             ELSE t4.UomName
        END AS 'UoMName' ,
        T4.UomEntry ,
        T0.U_CAT_CODE ,
        T0.U_CAT_NAME ,
        T1.CardName ,
        ( SELECT TOP ( 1 )
                    dbo.PDN1.U_AC_QTY_ORDER
          FROM      dbo.PDN1
                    INNER JOIN dbo.OPDN ON dbo.PDN1.DocEntry = dbo.OPDN.DocEntry
          WHERE     ( dbo.PDN1.ItemCode = T0.ItemCode )
                    AND ( dbo.OPDN.CardCode = T0.CardCode )
          ORDER BY  dbo.OPDN.DocDate DESC
        ) AS OQuantity ,
        ( SELECT TOP ( 1 )
                    PDN1_1.U_AC_QTY_BONUS
          FROM      dbo.PDN1 AS PDN1_1
                    INNER JOIN dbo.OPDN AS OPDN_1 ON PDN1_1.DocEntry = OPDN_1.DocEntry
          WHERE     ( PDN1_1.ItemCode = T0.ItemCode )
                    AND ( OPDN_1.CardCode = T0.CardCode )
          ORDER BY  OPDN_1.DocDate DESC
        ) AS BQuantity ,
        dbo.ITM1.Price ,
        ITM1Second.Price,
        T0.U_DISC_PER
FROM    dbo.OITM AS T0
        INNER JOIN dbo.OCRD AS T1 ON T0.CardCode = T1.CardCode
        INNER JOIN dbo.OUGP AS T2 ON T0.UgpEntry = T2.UgpEntry
        INNER JOIN dbo.UGP1 AS T3 ON T2.UgpEntry = T3.UgpEntry
        LEFT OUTER JOIN dbo.ITM1 ON T0.ItemCode = dbo.ITM1.ItemCode
                               AND dbo.ITM1.PriceList = '10'
        LEFT OUTER JOIN dbo.ITM1 ITM1Second ON T0.ItemCode = ITM1Second.ItemCode
                               AND ITM1Second.PriceList = '1'
        LEFT OUTER JOIN dbo.OUOM AS T4 ON T3.UomEntry = T4.UomEntry
WHERE   ( T0.Series = '65' )
        AND ( T4.UomEntry = 3
              OR T4.UomEntry = '-1'
            )