繁体   English   中英

选择具有多于一个独立列的整行

[英]Select entire row with more than one distinct column

我有一个基于发票项目的表格,我试图在其中使用SQL来检测物料/客户组合的价格或货币在什么日期发生了变化。 该表包含一些客户的发票,尽管材料可能很普通。

我的SQL技能非常基础,我尝试使用其他线程中使用的GROUP BY和DISTINCT尝试了几种不同的方法,但是我似乎总是会遇到麻烦。

数据基本上是这样的:

Invoice Inv. Date   Material    Price   Currency    Per/Qty    Customer
SE100   20140901    111111         1      EUR           1       840006
SE100   20140901    222222         2      EUR         1000      840006
SE100   20140901    333333         3      USD           1       840006
SE101   20140902    111111         1      EUR           1       840006
SE101   20140902    222222         2      EUR         1000      840006
SE101   20140902    333333         3      USD           1       840006
SE102   20140903    111111         2      EUR           1       840006
SE102   20140903    222222         2      USD         1000      840006
SE102   20140903    333333         3      USD           1       840006
SE103   20140904    111111         1      EUR           1       840006
SE103   20140904    222222         2      USD         1000      840006
SE103   20140904    333333         3      USD           1       840006

我要完成的工作基本上是为客户/物料/货币/价格的所有不同组合按日期顺序选择第一行,然后为在选择中多次出现的那些物料再选择整个行(按物料分类)。价格或货币已从初始值更改。

使用上表中的数据从查询中获得的预期输出将如下所示:

Invoice Inv. Date   Material    Price   Currency    Per/Qty    Customer
SE100   20140901    111111         1      EUR           1       840006
SE102   20140903    111111         2      EUR           1       840006
SE103   20140904    111111         1      EUR           1       840006
SE100   20140901    222222         2      EUR         1000      840006
SE102   20140903    222222         2      USD         1000      840006

我希望我能以一种可以理解的方式解释这个问题。 数据库引擎是SQL Server 2005 Express。

任何帮助,将不胜感激...

SQL中的关键字DISTINCT具有“唯一值”的含义。 当应用于查询中的列时,它将从结果集中返回与该列具有唯一,不同值的行一样多的行。 结果,它创建了一个分组的结果集,并且其他列的值是随机的,除非由其他函数(例如,max,min,average等)定义。

如果要说要返回所有第06列具有特定值的行,则使用“ where Col 06 = value ”子句

SELECT  mt.*
FROM    (
    SELECT  DISTINCT col6
    FROM    mytable
    ) mto
JOIN    mytable mt
ON      mt.id = 
    (
    SELECT  TOP 1 id
    FROM    mytable mti
    WHERE   mti.col6 = mto.col6
    -- ORDER BY
    --      id
    --  Uncomment the lines above if the order matters
    )

我认为这是您想要的内容的直接翻译:

select t.*
from mydata t join
     (select Customer, Material, count(distinct price) as numprices
      from mydata
      group by Customer, Material
      having count(distinct price) > 1
     ) cmcp
     on t.customer = cmcp.customer and t.material = cmcp.material;

这省去了货币。 不幸的是,SQL Server不支持将多个参数用于distinct 您可以这样包含它:

select t.*
from mydata t join
     (select Customer, Material,
             count(distinct cast(price as varchar(255)) + ':' + currency) as numprices
      from mydata
      group by Customer, Material
      having count(distinct cast(price as varchar(255)) + ':' + currency)  > 1
     ) cmcp
     on t.customer = cmcp.customer and t.material = cmcp.material;

大多数数据库都支持窗口/分析功能,因此您也可以将其表述为:

select t.*
from (select t.*,
             min(cast(price as varchar(255)) + ':' + currency)) over (partition by Customer, Material) as minprice,
             max(cast(price as varchar(255)) + ':' + currency)) over (partition by Customer, Material) as maxprice
      from mydata t
     ) t
where minprice <> maxprice
order by Material, Inv_Date;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM