【问题标题】:Invoke a column twice with different conditions使用不同的条件调用列两次
【发布时间】:2014-05-22 16:43:51
【问题描述】:

非常感谢您对此事的任何帮助 :) 现在正在撰写报告,我遇到了一些麻烦 我有这个查询,它工作正常,现在我想添加一个已经存在于查询中的库(来自同一个表),但是这次我会改变它的条件,顺便说一下两个条件列基于另一列 例如,如果我有这个:

Select Price from ITM1 WHERE PriceList = '1'

还有这个

Select Price from ITM1 WHERE PriceList = '10'

如何在同一个查询中编写并让它们显示在两个不同的列中? 如果有人可以帮助我完成它,我会将查询放在这里: 你可以在它的下部看到列价格和价格表,加粗。 我只需要再做一次同样的事情,但是用一个新的名称就可以了。

【问题讨论】:

  • 为什么CASE 表达式在您的示例中不起作用?还是我误解了这个问题?
  • 第一个thanx 4你的回复,第二个,我还是新手,我在这里尝试了太多b4发布的东西,总是有一个错误,如果你能用一个例子或方法指导我会很感激的
  • 您不能以这种方式添加带有 where 的列。您应该在 Pricelist = 1 时使用 select case,然后 pricelist 以 'Column1' 结尾并且相同但 =10 作为 'column2'
  • 我会试试@Damiea,谢谢

标签: sql sql-server join union


【解决方案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'
        )

【讨论】:

  • 只显示一个价格,另一个显示为 0 ,或者 oppissite , IN REAL , PriceList= '10 , and PriceLit = '1' 它们都存储了数据,所以每个coulmn 必须显示它自己的价格,另一个问题是使用相同的 ItemCode 会发生一些复制,但是在具有不同值的每一行中,我正在使用 Crestal Report 中的查询,我现在正在尝试解决这个问题,希望我可以在一天结束时这样做 :) 再次感谢您的帮助
  • 你好 Dan Andrews,我只想再次感谢你,大家都回复了这个,你今天救了我,你的快速反应,没有在我的管理层和客户面前尴尬,因为我我在我的第一个项目中仍然很新鲜,帮助太大了,客户要求我做更多的更改,因为我了解您对查询所做的更改,我想将此作为私人消息发送给您,但我不认为该网站提供了这个。 :)
【解决方案2】:

您应该能够再次加入该表,但您需要将连接设为外部:

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'
            )

【讨论】:

  • 我更喜欢 Dan Andrew 的回答,这个回答会慢很多,而且可能会产生不好的结果。
  • 这取决于他在做什么。您的答案是否正确取决于您阅读问题的方式:)
  • 亲爱的@Dave.Gugg 无论我如何尝试,我都无法感谢你,你只是拯救了我的一天,:) 我会以此为起点 :) :)
  • 亲爱的 Dan Andrews 非常感谢 4 UR 回复 :)
猜你喜欢
  • 1970-01-01
  • 2019-08-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-05
  • 2016-04-18
相关资源
最近更新 更多