1

我有以下数据:


   ID Column1 Column2 Column3 Column4 Column5
   001   A        C       D        A      B
   002   A        D       A        B      A
   003   B        K       Q        C      Q
   004   A        K       E        E      B

我想在视图中创建一个新列,该列为我提供每行 5 个源列中“A”的计数。结果应如下所示:

    ID Column1 Column2 Column3 Column4 Column5  SumOfA
    001   A        C       D        A      B       2
    002   A        D       A        B      A       3
    003   B        K       Q        C      Q       0
    004   A        K       E        E      B       1

我在这里看到了几个示例,但它们跨记录返回“A”的实例 - 我想要跨列的“A”计数,而不是跨行聚合。有什么想法吗?

4

4 回答 4

5

您可以使用多个CASE表达式来计算A值:

select id,
  column1, 
  column2,
  column3,
  column4, 
  column5,
  case when column1 = 'A' then 1 else 0 end +
  case when column2 = 'A' then 1 else 0 end +
  case when column3 = 'A' then 1 else 0 end +
  case when column4 = 'A' then 1 else 0 end +
  case when column5 = 'A' then 1 else 0 end TotalA
from yourtable

请参阅带有演示的 SQL Fiddle

于 2013-03-20T19:08:46.853 回答
4

对于这样的情况,我更喜欢使用 CROSS APPLY 来执行中间逻辑 UNPIVOT。

SELECT
   *
FROM
   dbo.YourTable T
   CROSS APPLY (
      SELECT Count(*)
      FROM (VALUES (Column1), (Column2), (Column3), (Column4), (Column5)) C (Val)
      WHERE Val = 'A'
   ) A (Cnt)

这还有一个优点,就是能够只在一个位置而不是 5 个位置更改您计数的值,并且如果需要,添加更多列非常容易。

看到这个在 Sql Fiddle 中工作

但是,您正在努力构建此查询表明表设计可能不是最好的。如果列名本身包含数据(例如时间段、区域或其他类型的类似值),则几乎可以肯定该设计是次优的。我强烈建议您存储未透视的数据——每个值使用一行和一列,新列表示它来自哪个原始列。

如果出于某种原因无法更改架构,则可以考虑创建一个视图:

CREATE VIEW dbo.YourTableUnpivoted
SELECT
   T.ID,
   C.*
FROM
   dbo.YourTable T
   CROSS APPLY (VALUES
      ('Column1', Column1),
      ('Column2', Column2),
      ('Column3', Column3),
      ('Column4', Column4),
      ('Column5', Column5)
   ) C (Col, Val);

(您也可以使用PIVOT运算符。)然后您可以像使用重新设计的表格一样使用它:

SELECT
   ID,
   Count(*)
FROM
   dbo.YourTableUnpivoted
WHERE
   Val = 'A'
GROUP BY
   ID;
于 2013-03-21T08:19:44.250 回答
1
SELECT 
(CASE WHEN Column1 = 'A' THEN 1 ELSE 0 END 
+ CASE WHEN Column2 = 'A' THEN 1 ELSE 0 END 
+ CASE WHEN Column3 = 'A' THEN 1 ELSE 0 END 
+ CASE WHEN Column4 = 'A' THEN 1 ELSE 0 END 
+ CASE WHEN Column5 = 'A' THEN 1 ELSE 0 END) AS SumOfA
FROM myTable
于 2013-03-20T19:07:26.070 回答
0

您可以使用CASE语句来实现这一点:

SELECT 
    column1, column2, column3, column4, column5,
    (CASE WHEN Column1 = 'A' THEN 1 ELSE 0 END   
     + CASE WHEN Column2 = 'A' THEN 1 ELSE 0 END   
     + CASE WHEN Column3 = 'A' THEN 1 ELSE 0 END   
     + CASE WHEN Column4 = 'A' THEN 1 ELSE 0 END   
     + CASE WHEN Column5 = 'A' THEN 1 ELSE 0 END) AS TotalSum  
FROM yourTable
于 2013-03-20T19:12:21.383 回答