1

次の表を考えます。

Chain    Name
123      Company 1
124      Other Company 1
123      Whatever Company
125      This One
126      That One
125      Another One
127      Last One

CountChain 列でを実行すると、次の結果が得られます。

123      2
124      1
125      2
126      1
127      1

チェーン 123 と 124 をグループ化して、一緒にカウントすることはできますか? グループ125と126も?変更された結果は次のようになります。

123/124  3
125/126  3
127      1

私のSQLは次のようになります。

SELECT Table1.Chain, Count(*) as [Count]
FROM Table1 LEFT JOIN Table2 on Table1.Chain = Table2.Chain
WHERE (((Table1.Chain) IN (Table2.Chain)))
GROUP BY Table1.Chain
ORDER BY Table1.Chain;

ありがとうございました!

4

5 に答える 5

3

ニーズによっては、これはちょっとしたハックかもしれませんが、探している Chain と ChainGroup を格納するテーブルを追加することになるでしょう。このようなもの:

Chain  ChainGroup
123      123/124
124      123/124
125      125/126
126      125/126
127      127/128

次に、クエリでこのテーブルに結合し、Chain でグループ化する代わりに、ChainGroup でグループ化します。

ネストされた IIF ステートメントのようなものよりも、デバッグがかなり難しくなるため、これをお勧めします。また、テーブルに追加するのが簡単で、新しいグループ化がクエリに自動的に表示されるようにする追加のグループ化が将来発生する可能性があります。 .

于 2013-04-11T15:48:00.910 に答える
2

はい、次のことができます。

SELECT min(Table1.Chain) & '/' & max(Table1.Chain) as chain, Count(*) as [Count]
FROM Table1 LEFT JOIN Table2 on Table1.Chain = Table2.Chain
WHERE (((Table1.Chain) IN (Table2.Chain)))
GROUP BY int((Table1.Chain-1)/2)
ORDER BY min(Table1.Chain);
于 2013-04-11T15:45:17.923 に答える
1

次のようなものを検討してください:

SELECT
chain_group, COUNT(*) FROM (
SELECT 
Table1.Chain, 
switch(Table1.Chain IN("123","124"), "123/124",
Table1.Chain IN("125","126"),"125/126",
Table1.Chain) AS chain_group
FROM 
Table1 INNER JOIN 
Table2 ON 
Table1.Chain = Table2.Chain) t
GROUP BY chain_group
ORDER BY chain_group
于 2013-04-11T16:02:30.353 に答える
1

ネストされたIifステートメントを使用できます。うまくいけば、私はすべての括弧をすぐ下に持っています! :-)

SELECT Iif(Table1.Chain="123", "123/124",
         Iif(Table1.Chain="124", "123/124",
           Iif(Table1.Chain="125", "125/126",
             Iif(Table1.Chain="126", "125/126", Table1.Chain)))) as [Chain]
 , Count(*) as [Count]
FROM Table1 LEFT JOIN Table2 on Table1.Chain = Table2.Chain
WHERE (((Table1.Chain) IN (Table2.Chain)))
GROUP BY Iif(Table1.Chain="123", "123/124",
           Iif(Table1.Chain="124", "123/124",
             Iif(Table1.Chain="125", "125/126",
               Iif(Table1.Chain="126", "125/126", Table1.Chain))))
ORDER BY Table1.Chain;

クエリでステートメントを 2 回記述したくない場合は、caseステートメントを句のサブクエリまたは共通テーブル式に移動することもできます。from

于 2013-04-11T15:39:57.047 に答える
0

以下の例を見ることができます ----- Make main Table

CREATE TABLE #test 
( id int , Name varchar(100))

INSERT #test(id,Name)
values (123,'Company 1'),
(124,'Other Company 1'),
(123,      'Whatever Company'),
(125,      'This One'),
(126 ,     'That One'),
(125,      'Another One'),
(127,      'Last One')

CREATE TABLE #temp
(rowID INT IDENTITY(1,1) , ID INT ,cnt INT )

CREATE TABLE #tempResult
(ID VARCHAR(20) ,cnt INT )

INSERT INTO #temp(ID,cnt)
SELECT  ID ,COUNT(1) cnt FROM  #test GROUP BY ID 

DECLARE @rowCnt INT , @TotalCnt INT , @even INT , @odd INT , 
@idNum VARCHAR(20) , @valueCnt INT , @inStart INT = 1

SET @rowCnt  = 1
SET @even = 1 
SET @odd = 2

SELECT @TotalCnt = COUNT(1) FROM #temp

WHILE @rowCnt <= @TotalCnt
BEGIN
    SET @inStart = 1
    SET @odd = @rowCnt 
    SET @even = @rowCnt + 1
    SET @idNum = ''
    SET @valueCnt = 0

    WHILE @inStart <= 2
    BEGIN

    IF @inStart = 1
    Begin
     SELECT @idNum = Convert(VARCHAR(5),ID) , @valueCnt = cnt 
     FROM #temp WHERE rowID = @odd
    End 
    ELSE
    BEGIN
    SELECT @idNum = @idNum + '/' + Convert(VARCHAR(5),ID) , @valueCnt = @valueCnt  + cnt 
FROM #temp WHERE rowID = @even  
    END
        SET @inStart = @inStart + 1
    END
    INSERT INTO #tempResult (ID, Cnt) 
    VALUES (@idNum,@valueCnt)

    SET @rowCnt = @rowCnt + 2
END

SELECT *
FROM #tempResult
于 2013-04-11T16:33:28.247 に答える