【问题标题】:sql group by with count to know the statussql group by with count 了解状态
【发布时间】:2018-06-17 05:10:57
【问题描述】:

大家好,我有两张这样的表,一张是subscripiton,下面有这样的列..

Id  SubscriptionKey  
 1   subkey1
 2   subkey2
 3   subKey3

另一个表是 guardkey 具有如下列

 id     key    SubscriptionKey   IsConverted
  1     key1     subkey1           True
  2     key2     subkey1           true
  3     key3     subkey2           true
  4     Key4     subkey2           false
  5     key5     subkey2           true
  6     key6     subKey1           false
  7     key7     subkey3           true
  8     key8     subkey3           true

我们怎样才能知道与特定子键相关的所有键是否都被转换了..

我将此数据绑定到 gridview,如果该特定子键的所有键都已转换,我需要禁用该特定行

任何人都可以帮助解决如何检查是否所有密钥都转换为特定密钥..

提前非常感谢..

我正在使用 sql server..

预期输出是这样的

 subscriptionkey 
      subkey1
      subkey2

【问题讨论】:

  • 您的预期输出是什么?
  • 嗨...我修改了问题以获得如上所述的预期输出..
  • @AbdulRasheed 我修改了我的问题以反映预期的输出..

标签: sql-server tsql sql-server-2012 sql-server-2014 sql-server-2016


【解决方案1】:

您可以使用以下查询:

SELECT SubscriptionKey
FROM guardkey
GROUP BY SubscriptionKey
HAVING COUNT(*) <> COUNT(CASE WHEN IsConverted = 'True' THEN 1 END)

HAVING 子句使用COUNT 函数两次:

  • 第一次统计该组的所有记录(COUNT(*)
  • 第二次有条件地统计组的“转换”记录。

如果这两个计数不同,则不转换子键,查询返回其值。

Demo here

编辑:要从subscription 表中获取其余字段,您可以将上述查询用作派生表:

SELECT s.*
FROM subscription AS s
JOIN (
    SELECT SubscriptionKey
    FROM guardkey
    GROUP BY SubscriptionKey
    HAVING COUNT(*) <> COUNT(CASE WHEN IsConverted = 'True' THEN 1 END)
) AS t ON s.SubscriptionKey = t.SubscriptionKey 

【讨论】:

  • 感谢您的查询..但我需要从订阅表中选择其他列信息...我怎样才能得到那个..
【解决方案2】:

这将是归档上述内容的简单方法

DECLARE @T1 TABLE
(
    Id INT,
    SubscriptionKey VARCHAR(50)
)

DECLARE @T2 TABLE
(
    Id INT,
    [key] VARCHAR(50),
    SubscriptionKey VARCHAR(50),
    IsConverted BIT
)

INSERT INTO @t1
VALUES(1,'SubKey1'),
(2,'SubKey2'),
(3,'SubKey3')

INSERT INTO @T2
VALUES
(1,'key1','subkey1',1),
(2,'key2','subkey1',1),
(3,'key3','subkey2',1),
(4,'Key4','subkey2',0),
(5,'key5','subkey2',1),
(6,'key6','subKey1',0)

SELECT
    *
    FROM @T1 t1
        WHERE EXISTS(
            SELECT 1 FROM @T2 T2 WHERE T2.SubscriptionKey = t1.SubscriptionKey AND IsConverted = 1
        )
        AND NOT EXISTS(
            SELECT 1 FROM @T2 T2 WHERE T2.SubscriptionKey = t1.SubscriptionKey AND IsConverted = 0
        )

【讨论】:

    【解决方案3】:

    请试试这个-

    --未转换的订阅密钥

    SELECT [id], [key], [SubscriptionKey], [IsConverted]
    FROM 
    (
        SELECT * , COUNT(CASE WHEN IsConverted = 'True' THEN 1 END) OVER (PARTITION BY SubscriptionKey) a
                 , COUNT(*) OVER (PARTITION BY SubscriptionKey) b     
        FROM guardkey
    )x WHERE a = b
    
    id          key  SubscriptionKey IsConverted
    ----------- ---- --------------- -----------
    7           key7 subkey3         true
    8           key8 subkey3         true
    (2 rows affected)
    

    --转换的订阅密钥

    SELECT [id], [key], [SubscriptionKey], [IsConverted]
    FROM 
    (
        SELECT * , COUNT(CASE WHEN IsConverted = 'True' THEN 1 END) OVER (PARTITION BY SubscriptionKey) a
                 , COUNT(*) OVER (PARTITION BY SubscriptionKey) b     
        FROM guardkey
    )x WHERE a < b
    
    id          key  SubscriptionKey IsConverted
    ----------- ---- --------------- -----------
    1           key1 subkey1         True
    2           key2 subkey1         true
    6           key6 subKey1         false
    3           key3 subkey2         true
    4           Key4 subkey2         false
    5           key5 subkey2         true
    
    
    (6 rows affected)
    

    【讨论】:

      猜你喜欢
      • 2014-11-07
      • 1970-01-01
      • 2020-08-02
      • 1970-01-01
      • 2020-10-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多