sql如何只显示具有相同列值的行一次

时间:2016-03-04 10:59:23

标签: sql

enter image description here

这是我的桌子。 我需要编写一个显示所有记录的查询,但是当项目达到100%时,它只显示该项目的记录一次。 所以结果应该是 enter image description here

使用SQL SERVER 2005

6 个答案:

答案 0 :(得分:2)

如果同一项目的其他行(较低日期)已达到100%,请使用NOT EXISTS返回一行:

SELECT t1.*
FROM table_name t1
WHERE NOT EXISTS (select 1 from tablename t2
                  where t2.project = t1.project
                    and t2.report_date < t1.report_date
                    and t2.percentage_complete = 100)

执行SELECT DISTINCT删除重复的行(无论百分比。)

答案 1 :(得分:0)

您可以使用GROUP BY

SELECT project, MIN(report_date) AS report_date, percentage
FROM table_name
GROUP BY project, percentage
ORDER BY project, report_date;

MIN会选择百分比相同的第一个日期。

LiveDemo

输出:

╔═════════╦═════════════════════╦════════════╗
║ project ║     report_date     ║ percentage ║
╠═════════╬═════════════════════╬════════════╣
║ ABC     ║ 2016-02-03 00:00:00 ║         45 ║
║ DEF     ║ 2016-02-04 00:00:00 ║         55 ║
║ EFG     ║ 2016-02-05 00:00:00 ║         66 ║
║ EFG     ║ 2016-02-15 00:00:00 ║        100 ║
║ XYZ     ║ 2016-02-06 00:00:00 ║         55 ║
║ XYZ     ║ 2016-02-07 00:00:00 ║         76 ║
║ XYZ     ║ 2016-02-08 00:00:00 ║         87 ║
║ XYZ     ║ 2016-02-09 00:00:00 ║        100 ║
╚═════════╩═════════════════════╩════════════╝

答案 2 :(得分:0)

您可以使用视图执行该操作

只为您的问题编写以下查询

从table_name where condition;

创建视图view_name作为select column_name

你必须在例如: - ssid = 2

的条件下写行

其中ssid是column_name。

答案 3 :(得分:0)

你可以尝试一个简单的区别。它会隐藏所有重复的行,而不仅仅是100%的行,但它可能适合你。

SELECT DISTINCT * FROM table_name

答案 4 :(得分:0)

结合GROUP BY和IF:

void WriteCSV(char *filename, MatrixXd X){
  ofstream myfile;
  myfile.open (filename);

  for (int i = 0; i < X.rows(); ++i)
  {
      for (int j = 0; j < X.cols(); ++j)
      {
          myfile<<X(i,j);
          if (j!=X.cols()-1)
          {
             myfile<<",";
          }else{
             myfile<<"\n";
          }
      } 
  }
  myfile.close();
}

如有必要,您可以添加订单。

UPD:而不是null应该使用唯一字段:

SELECT * 
FROM  tbale_name 
GROUP BY IF(  percentage = 100, project, NULL ) 

答案 5 :(得分:0)

尝试CASE statements,并使用ROW_NUMBER()控制哪个记录显示所需的值以及何时显示。

这里是一个示例,其中我在VIEW中有一个伪的“主”键,但表中的值实际上会重复。

即我想要这个

    ManifestID  QTY
    A1          200
    A1          null
    A1          null
    A1          null
    A2          50
    A3          23
    A4          78

但这不是...

    ManifestID  QTY
    A1          200
    A1          200
    A1          200
    A1          200
    A2          50
    A3          23
    A4          78

SQL

    ALTER VIEW [dbo].[vwEDImanifestLinesRowCount] AS
        SELECT v.ManifestID, 
               CASE WHEN ROW_NUMBER() OVER(PARTITION BY v.VisitID, v.PortID, v.ManifestID ORDER BY v.ManifestID) = 1
                    THEN SPOTmanifest.QTY 
                    ELSE NULL
               END AS [SPOT Manifest QTY]
        FROM   vwEDImanifestLines AS v 
            LEFT JOIN vwEDIinSPOTManifestData AS SPOTmanifest 
                ON SPOTmanifest.ManifestID = v.ManifestID AND SPOTmanifest.VisitID = v.VisitID

实际上,我是说,如果ROW_NUMBER()对于第一个记录返回1,则使用链接表中的QTY值。否则返回NULL。因此,显示了重复的行,但是QTY只显示了一次。您可以进一步控制此操作,以使记录的第二,第三等行显示值,而不总是第一或最后一条记录。无需GROUP BY。