【问题标题】:Count many columns have the same value计算许多列具有相同的值
【发布时间】:2021-04-13 20:58:33
【问题描述】:

我如何编写一个 SQL 查询来返回计算一行中每一列的相似值?

我有这个:

emp_no d1 d2 d3 d4 d5 d6 d7 d8 d9 d10 date
1002 2 2 2 26 26 4 4 53 53 53 2021-03-31
1003 4 4 4 26 26 2 26 26 26 26 2021-03-31
1002 2 2 2 26 26 4 4 26 26 26 2021-04-30

我想要这样的结果:

emp_no 2 4 26 51 53 date
1002 3 2 2 0 3 2021-03-31
1003 1 3 6 0 0 2021-03-31
1002 3 2 2 0 3 2021-04-30

我尝试使用UNPIVOT 数据,但我该如何调整它?

我是否使用未透视数据创建视图,然后重新透视聚合数据?

SELECT EMP_NO, TS_MTH_YR, TSS_D
FROM (
    SELECT EMP_NO, TS_MTH_YR, [D1], [D2], [D3], [D4], [D5], [D6], [D7], [D8], [D9], [D10]
    FROM TSS_MONTHLY_TS
) AS TSS
UNPIVOT (
    TSS_D FOR TSS_DAYS IN ([D1], [D2], [D3], [D4], [D5], [D6], [D7], [D8], [D9], [D10])
) AS TS

【问题讨论】:

  • 您实际上需要取消透视数据,然后重新透视聚合数据。你试过什么了?为什么它不起作用?
  • @Larnu 我该怎么做?
  • 您使用的是哪个版本的 sql server ? select @@version
  • “我是怎么做到的?”展示你的尝试?使用edit 功能@AlQaqaaBenghuzi。
  • 使用 SQL 查询,您可以选择之前已知的列。你知道这些专栏吗?您知道您要选择的总是第 2、4、26、51 和 53 列吗?或者未来还能有其他价值吗?如果是这样,您需要一种动态方法。最简单的方法可能是简单地select *,然后让您的应用逐行、逐列读取并在该过程中构建网格。

标签: sql sql-server tsql pivot sql-server-2017


【解决方案1】:

正如我在 cmets 中提到的,您需要先在此处取消透视然后再重新透视您的数据。因此,一种方法如下:

WITH YourTable AS(
    SELECT emp_no ,d1 ,d2 ,d3 ,d4 ,d5 ,d6 ,d7 ,d8 ,d9 ,d10 , CONVERT(date,date) AS date --That's not confusing
    FROM (VALUES(1002,2,2,2,26,26,4,4 ,53 ,53 ,53 ,'2021-03-31'),
                (1003,4,4,4,26,26,2,26, 26, 26, 26,'    2021-03-31'),
                (1002,2,2,2,26,26,4,4 ,26 ,26 ,26 ,'2021-04-30'))V(emp_no ,d1 ,d2 ,d3 ,d4 ,d5 ,d6 ,d7 ,d8 ,d9 ,d10 ,date))
SELECT YT.emp_no,
       COUNT(CASE V.Val WHEN 2 THEN 1 END) AS [2],
       COUNT(CASE V.Val WHEN 4 THEN 1 END) AS [4],
       COUNT(CASE V.Val WHEN 26 THEN 1 END) AS [26],
       COUNT(CASE V.Val WHEN 51 THEN 1 END) AS [51],
       COUNT(CASE V.Val WHEN 53 THEN 1 END) AS [53],
       YT.[date]
FROM YourTable YT
     CROSS APPLY (VALUES('d1',YT.d1),
                        ('d2',YT.d2),
                        ('d3',YT.d3),
                        ('d4',YT.d4),
                        ('d5',YT.d5),
                        ('d6',YT.d6),
                        ('d7',YT.d7),
                        ('d8',YT.d8),
                        ('d9',YT.d9),
                        ('d10',YT.d10))V(Col,Val)
GROUP BY YT.emp_no,
         YT.[date];

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-08-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-01
    相关资源
    最近更新 更多