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

Sql 使用不同的条件调用列两次,sql,sql-server,join,union,Sql,Sql Server,Join,Union,我非常感谢在这件事上的任何帮助:) 我现在正在写一份报告,我遇到了一些麻烦 我有这个查询,它工作得很好,现在我想添加一个已经存在于查询中的coulmn(来自同一个表),但这次我将更改它的条件,顺便说一句,这两列中的条件都基于另一列 例如,如果我有这样一个: Select Price from ITM1 WHERE PriceList = '1' 还有这个 Select Price from ITM1 WHERE PriceList = '10' 如何在同一个查询中编写并让它们显示在两个不同的

我非常感谢在这件事上的任何帮助:) 我现在正在写一份报告,我遇到了一些麻烦 我有这个查询,它工作得很好,现在我想添加一个已经存在于查询中的coulmn(来自同一个表),但这次我将更改它的条件,顺便说一句,这两列中的条件都基于另一列 例如,如果我有这样一个:

Select Price from ITM1 WHERE PriceList = '1'
还有这个

Select Price from ITM1 WHERE PriceList = '10'
如何在同一个查询中编写并让它们显示在两个不同的列中? 如果有人能帮我解决这个问题,我会把这个问题放在这里: 您可以在它的下半部分看到Price&PriceList列,粗体。 我只需要再做一次同样的事情,但要有一个新的coulmn名称,就是这样。

使用会给你想要的。但是,您可以对查询进行其他更改,以提高性能,但这超出了问题的范围。我不清楚你想用不同的“栏目”做什么,请帮忙解释一下否则请参见@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 ,
        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'
            )

为什么在您的示例中,
案例
表达式不起作用?还是我误解了这个问题?1 thanx 4你的回答,2,我在这方面还是新的,我在这里贴了太多东西,总是有错误,如果你能用一个例子或方法指导我,我将非常感谢你不能添加一个这样的专栏。当Pricelist=1时,你应该使用select case,然后Pricelist以'Column1'结尾,同样的,但以=10作为'column2',我会尝试@Damiea,thxI更像Dan Andrew的答案,这个答案会运行得慢很多,可能会产生不好的结果。这取决于他在做什么。你的答案是正确的,这取决于你对问题的理解:)亲爱的@Dave.Gugg我无法感谢你,无论我怎么努力,你刚刚救了我一天:)我将以此作为我的开始:)亲爱的Dan Andrews thax这么多4你的回答:)只有一个价格显示,另一个显示为0,或者说是Oppersite,在现实中,PriceList='10,Pricelt='1'它们都存储有数据,所以每个coulmn都必须显示它自己的价格,另一个问题是,在相同的ItemCode中发生了一些复制,但在每个具有不同值的行中,我将在Crestal Report中使用查询,我现在正试图解决这个问题,希望我能在一天结束时这样做:)再次感谢你的帮助你好Dan Andrews,我只想再次感谢你你和每个人都回答了这个问题,你今天的快速反应救了我,并且没有在我的管理层和客户面前感到尴尬,因为我对我帮助太多的第一个项目还很新鲜,客户要求我做更多的更改,因为我了解了您对查询所做的更改,我想将此作为私人信息发送给您,但我认为网站没有提供此信息。:)
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'
            )